, хотя микробенчмарки, показанные выше, кажутся немного небезопасными, можно ожидать, что горячая точка обнаружит, что val никогда не меняется и никогда не используется. Еще одна вещь, которую нужно иметь в виду, это то, что бывают случаи, когда средние значения (из 2 реализаций) могут быть близки друг к другу в абсолютном выражении, но когда 1 имеет довольно плохую хвостовую стоимость по сравнению с другим, например, Ваше значение 90-го процентиля может быть очень похоже, но последние 10% намного хуже.
Например, изменение его для использования другого значения каждый раз и выгрузка значения в stderr приводит к несколько более высокой средней стоимости (~ 3300 нс против ~ 2500 нс для случая, когда значение используется повторно) на моем ящике. Это намного выше, чем у других постов, по-видимому, потому что требуется некоторое время, чтобы фактически получить время, чтобы измерение было искусственно завышено. Это только показывает одну из трудностей в создании хорошего микробенчмарка.
Стоит также отметить, что я не могу измерить тот эффект, который я предложил, например, присутствовать. если он присутствует, то вы можете ожидать, что он будет полностью оптимизирован. Я полагаю, вы могли бы видеть, что происходит через LogCompilation
, если вы действительно заинтересованы.
int runs = 10000000;
long totalTime = 0;
for (int i = 0; i < runs; i++) {
String val = "" + Math.random();
long start = System.nanoTime();
float f = Float.parseFloat(val);
long end = System.nanoTime();
System.err.println(f);
totalTime += (end-start);
}
long time = totalTime / runs;
totalTime = 0;
for (int i = 0; i < runs; i++) {
String val = "" + Math.random();
long start = System.nanoTime();
double d = Double.parseDouble(val);
long end = System.nanoTime();
System.err.println(d);
totalTime += (end-start);
}
long time2 = totalTime / runs;
System.out.println("Average Float.parseFloat() time was " + time + " ns.");
System.out.println("Average Double.parseDouble() time was " + time2 + " ns.");