Я написал небольшой тест, чтобы сравнить производительность разных интерпретаторов /компиляторов для Python, Ruby, JavaScript и C ++.
Как и ожидалось, оказывается, что (оптимизированный) C ++ побеждает языки сценария, но фактор что это так, невероятно высокое. < /p>
Результаты: < /p>
sven@jet:~/tmp/js$ time node bla.js # * JavaScript with node *
0
real 0m1.222s
user 0m1.190s
sys 0m0.015s
sven@jet:~/tmp/js$ time ruby foo.rb # * Ruby *
0
real 0m52.428s
user 0m52.395s
sys 0m0.028s
sven@jet:~/tmp/js$ time python blub.py # * Python with CPython *
0
real 1m16.480s
user 1m16.371s
sys 0m0.080s
sven@jet:~/tmp/js$ time pypy blub.py # * Python with PyPy *
0
real 0m4.707s
user 0m4.579s
sys 0m0.028s
sven@jet:~/tmp/js$ time ./cpp_non_optimized 1000 1000000 # * C++ with -O0 (gcc) *
0
real 0m1.702s
user 0m1.699s
sys 0m0.002s
sven@jet:~/tmp/js$ time ./cpp_optimized 1000 1000000 # * C++ with -O3 (gcc) *
0
real 0m0.003s # (!!!)
Мне интересно, может ли кто -нибудь дать объяснение, почему оптимизированный код C ++ на три порядка быстрее, чем все остальное. < /p>
Clatchmark C ++ использует параметры командной строки, чтобы предотвратить предварительное вычисление результата во время компиляции. < /p>
ниже, я разместил исходные коды Различные языковые тесты, которые должны быть семантически эквивалентными.
Также я предоставил код сборки для оптимизированного вывода компилятора C ++ (с помощью GCC).
При просмотре оптимизированной сборки кажется, что компилятор объединил Две петли в эталоне до одного, но, тем не менее, все еще есть цикл! >
var s = 0;
var outer = 1000;
var inner = 1000000;
for (var i = 0; i < outer; ++i) {
for (var j = 0; j < inner; ++j) {
++s;
}
s -= inner;
}
console.log(s);
< /code>
python: < /strong> < /p>
s = 0
outer = 1000
inner = 1000000
for _ in xrange(outer):
for _ in xrange(inner):
s += 1
s -= inner
print s
< /code>
ruby: < /strong> < /p>
s = 0
outer = 1000
inner = 1000000
outer_end = outer - 1
inner_end = inner - 1
for i in 0..outer_end
for j in 0..inner_end
s = s + 1
end
s = s - inner
end
puts s
< /code>
c ++: < /strong> < /p>
#include
#include
#include
int main(int argc, char* argv[]) {
uint32_t s = 0;
uint32_t outer = atoi(argv[1]);
uint32_t inner = atoi(argv[2]);
for (uint32_t i = 0; i < outer; ++i) {
for (uint32_t j = 0; j < inner; ++j)
++s;
s -= inner;
}
std::cout
Подробнее здесь: https://stackoverflow.com/questions/248 ... dibly-fast