所以我有這個Java程序,我用它來通過幾TB的數據。性能是一個問題。Java中的高效strtod?
我異形的應用程序,所有內存分配的很大一部分,以及CPU時間的很大一部分來自於執行一個簡單的操作:
我有ASCII字符數組。我知道從偏移量i
到偏移量j
的字符表示一個浮點數。我需要將該浮點數字提取爲double
。
天真Double.parseDouble(new String(buf, i, j - i))
完成這項工作。然而,這是很多的時間都花在和大量的內存分配來的,可能是因爲:
new String()
創建一個新對象,創建一個內部char[]
陣列 並拷貝到字符數組;Double.parseDouble()
創建一個FloatingDecimal
對象,也創建一個char[]
數組, 也將字符複製到它。
所有這些分配和所有這些複製並不是真的有必要。我能避免它們嗎?
我真正喜歡的是一個strtod
樣的功能,將採取一個char[]
(或byte[]
),以及開始/結束偏移,並返回一個double
。
有什麼建議嗎?我應該推出自己的?我應該在strtod
周圍寫一個JNI包裝嗎?我應該使用一些已經存在的Java庫嗎?
其實,String.substring方法不會複製初始數組。如果String構造函數是一個瓶頸,它可能會很有用。 –