Сравнение производительности неизменяемой конкатенации строк между Java и Python

ОБНОВЛЕНИЯ: большое спасибо Гейбу и Гленну за подробное объяснение. Тест написан не для сравнения языков, а просто для моего изучения технологий оптимизации виртуальных машин.

Я провел простой тест, чтобы понять производительность конкатенации строк между 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)
5
задан Cuper Hector 11 October 2010 в 07:49
поделиться