Итак, у меня есть эта Java-программа, которую я использую для обработки нескольких терабайт данных.Производительность - это проблема.
Я профилировал приложение, и большая часть всех выделений памяти, а также большая часть времени ЦП приходятся на выполнение одной простой операции:
У меня естьмассив символов ASCII.Я знаю, что символы от смещения i
до смещения j
представляют число с плавающей запятой.Мне нужно извлечь это число с плавающей точкой в double
.
Наивный Double.parseDouble(new String(buf, i, j - i))
делает свою работу.Однако именно здесь тратится много времени и выделяется много памяти, вероятно потому, что:
new String()
создает новый объект, создает внутренний массив char[]
и копируетсимволов в массив; Double.parseDouble()
создает объект FloatingDecimal
и также создает массив char[]
, также копируя в него символы.
Все эти выделения и все это копирование не являются действительно необходимыми.Могу ли я избежать их?
Что мне действительно нужно, так это strtod
-подобная функция, которая будет принимать char[]
(или byte[]
), а также запуск /завершить смещения и вернуть double
.
Есть предложения?Должен ли я выкатить свой собственный?Должен ли я написать оболочку JNI около strtod
?Должен ли я использовать библиотеку Java, которая уже существует?