Ради презентации на работе, я хотел бы сравнить производительность NodeJS на C. Вот что я писал:Почему этот NodeJS 2x быстрее, чем родной C?
Node.js (for.js):
var d = 0.0,
start = new Date().getTime();
for (var i = 0; i < 100000000; i++)
{
d += i >> 1;
}
var end = new Date().getTime();
console.log(d);
console.log(end - start);
C (for.c)
#include <stdio.h>
#include <time.h>
int main() {
clock_t start = clock();
long d = 0.0;
for (long i = 0; i < 100000000; i++)
{
d += i >> 1;
}
clock_t end = clock();
clock_t elapsed = (end - start)/(CLOCKS_PER_SEC/1000);
printf("%ld\n", d);
printf("%lu\n", elapsed);
}
Использование GCC Я собирал мой for.c
и побежал:
gcc for.c
./a.out
Результаты:
2499999950000000
198
Тогда я попытался его в NodeJS:
node for.js
Результаты:
2499999950000000
116
После запуска несколько раз, я обнаружил, что это не самое относится ни на что. Если я переключил for.c на использование double
вместо long
в цикле, время C заняло еще больше!
Не пытайтесь начать пламенную войну, но почему Node.JS (116 мс.) Намного быстрее, чем нативный C (198 мс) при выполнении этой же операции? Использует ли Node.JS оптимизацию, которую GCC не делает из коробки?
EDIT:
За предложение в комментариях, я побежал gcc -Wall -O2 for.c
. Результаты улучшились до C с 29 мс. Это задает вопрос, как настраиваемые параметры C не оптимизируются, как компилятор Javascript? Также, что -Wall и -02 делают. Мне действительно интересно узнать, что здесь происходит.
Попробуйте выполнить компиляцию с 'gcc -Wall -O2 for.c' и снова проверить. Использование 'gcc' (или' clang') без передачи какого-либо явного флага оптимизации для бенчмаркинга бесполезно! –
Вы пытались явно установить разные уровни оптимизации при компиляции программы на C? – mscdex
'long d = 0.0;' - не 'long' целочисленный тип? – usr2564301