ОБНОВЛЕНИЯ: большое спасибо Гейбу и Гленну за подробное объяснение. Тест написан не для сравнения языков, а просто для моего изучения технологий оптимизации виртуальных машин.
Я провел простой тест, чтобы понять производительность конкатенации строк между Java и Python.
Тест предназначен для неизменяемого объекта / типа String по умолчанию на обоих языках. Поэтому я не использую StringBuilder / StringBuffer в тесте Java.
Тест просто добавляет строки 100 тысяч раз. Java требует ~ 32 секунды для завершения, в то время как Python использует только ~ 13 секунд для строки Unicode и 0,042 секунды для строки, отличной от Unicode.
Я немного удивлен результатами. Я думал, что Java должна быть быстрее Python. Какую технологию оптимизации использует Python для повышения производительности? Или объект String слишком сложен в Java?
ОС: Ubuntu 10.04 x64 JDK: Вс 1.6.0_21 Python: 2.6.5
В тесте Java действительно использовалось -Xms1024m для минимизации активности сборки мусора.
Код Java:
public class StringConcateTest {
public static void test(int n) {
long start = System.currentTimeMillis();
String a = "";
for (int i = 0; i < n; i++) {
a = a.concat(String.valueOf(i));
}
long end = System.currentTimeMillis();
System.out.println(a.length() + ", time:" + (end - start));
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
test(1000 * 100);
}
}
}
Код Python:
import time
def f(n):
start = time.time()
a = u'' #remove u to use non Unicode string
for i in xrange(n):
a = a + str(i)
print len(a), 'time', (time.time() - start)*1000.0
for j in xrange(10):
f(1000 * 100)