Комментарии 4
Жестко, спасибо. Дык то есть внутри JDK бутстрапа "a"+"b" компилируется в `new StringBuilder().append("a").append("b")` и это медленнее чем переписывание вручную на `new StringBuilder(2).append("a").append("b")` ? И почему вы тогда не хотите, вместо переписывания всех внутренностей JDK на StringBuilder(length), пофиксить этот баг с неоптимальной компиляцией плюса? Шобы если "a"+"b" компилируется в StringBuilder а не в invokeDynamic, он бы уж компилировался в StringBuilder c правильным length?
Точно не знаю, вероятно, из-за возможных НПЕ в коде вроде:
int length = str1.length() + str2.length();
new StringBuilder().append(str1).append(str2).toString();
Было предложение заменять сложение строго двух строк явным вызовом str1.concat(str2)
, но тут во-первых нарушается требование спецификации о создании новой строки при сложении, во-вторых возможен НПЕ.
Это зависит от ОС, версии ява-машины, типа процессора? На Андроиде, например, такие же результаты будут?
Абсолютные числа, разумеется, зависят от процессора и версии JDK, в статье я как раз и привёл пример кода, который работает по-разному в зависимости от версии явы.
От оси соотношения между показателями по идее не должны зависеть (как и абсолютные значения).
Про Андроид точно сказать не могу, я никогда не разрабатывал под мобильные устройства. Если JDK и JRE там те же, что и на настольных машинах, то всё будет так же.
Производительность: нюансы против очевидностей. JDK edition