Почему эта программа C ++ так невероятно быстрая?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему эта программа C ++ так невероятно быстрая?

Сообщение Anonymous »

Я написал небольшой тест, чтобы сравнить производительность разных интерпретаторов /компиляторов для 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»