В некотором коде, который я сделал, сравнивается время, затрачиваемое на объединение строк с помощью "string" + "string"
:
for(int i = 0; i < 100000000L; i++)
{
String str2 = str + str;
}
to "string".concat("string")
:
for(int i = 0; i < 100000000L; i++)
{
String str2 = str.concat(str);
}
Где str == "string"
.
Выход, который я получаю, последовательно похож на этот, хотя средняя разница, как правило, ближе к 61 наносекундам:
String str2 = str + str
: 118.57349468 наносекунды
String str2 = str.concat(str)
: 52.36809985 наносекунды
.concat
быстрее, чем+
на 66.20539483 наносекунды
Это показывает, что даже с циклом и назначением новой строки .concat
быстрее, чем +
более чем на два. Когда я использую еще более длинную строку (str == "this is a really really very long string that is very long"
), она быстрее примерно в три раза. Это особенно странно, потому что если .concat
работает быстрее, не следует ли компилировать +
на .concat
?
Мой главный вопрос: Почему .concat
быстрее?
Полный код, если вы хотите запустить его и поэкспериментировать с ним:
public class TimeCompare
{
public static void main(String[] args)
{
final long times = 100000000L;
String str = "String";
long start1 = System.nanoTime();
for(int i = 0; i < times; i++)
{
String str2 = str + str;
}
long end1 = System.nanoTime();
long time1 = end1 - start1;
System.out.println((double)(time1) / times);
System.out.println();
long start2 = System.nanoTime();
for(int i = 0; i < times; i++)
{
String str2 = str.concat(str);
}
long end2 = System.nanoTime();
long time2 = end2 - start2;
System.out.println((double)(time2) / times);
System.out.println();
System.out.println(".concat is faster than \"+\" by " + ((double)(time1 - time2) / times) + " nanoseconds");
}
}