我注意到在C ++中打印到控制台的时间似乎比在Javascript中打印时间要长,但我原本期望相反。我用JS和C ++创建了这两个fizzbuzz测试:
JS
window.onload = function()
{
console.time("test");
for(var i = 0; i < 10001; i++)
{
if(i % 3 == 0 && i % 5 == 0)
{
console.log(i + " -- fizzbuzz \n");
}
else if(i % 3 == 0)
{
console.log(i + " -- fizz \n");
}
else if(i % 5 == 0)
{
console.log(i + " -- buzz \n");
}
}
console.timeEnd("test");
}
C ++
#include "stdafx.h"
#include <cstdio>
#include <ctime>
int main()
{
std::clock_t start;
double duration;
start = std::clock();
for (int i = 0; i < 10001; i++)
{
if (i % 3 == 0 && i % 5 == 0)
{
printf("%d -- fizzbuzz \n", i);
}
else if (i % 3 == 0)
{
printf("%d -- fizz \n", i);
}
else if (i % 5 == 0)
{
printf("%d buzz \n", i);
}
}
duration = ((std::clock() - start) / (double)CLOCKS_PER_SEC);
printf("duration: %f \n", duration);
std::getchar();
return 0;
}
结果
JS
492.54ms 498.77ms 502.36ms
C ++
2017ms 2149ms 2357ms
任何人都可以解释为什么像C ++这样的编译语言比Javascript这样的解释型弱类型语言要慢〜4倍?我意识到我的测试方式可能存在问题,但我只是对这个问题的原因感到好奇。
答案 0 :(得分:1)
您正在两种不同的环境中进行测试。为了使其成为公平的测试,我决定在类似的环境中测试它(相同的主机,cat /proc/cpuinfo
报告的2GHz AMD A10-6800K处理器):
Javascrtipt - 在Linux上使用node
二进制版本0.10.25从bash提示符执行。结果在83ms左右一致。我不得不删除window.onload
包装器,否则它就是你的代码。
C ++ - 我不得不删除包含stdafx.h
以使其编译。我也删除了对getchar()
的调用,因为这是不必要的。我用g ++ 4.8.4编译了默认值,然后从bash提示符再次运行它。结果在10ms到20ms之间变化。
当我将标准输出重定向到文件时,Javascript在42ms内执行,而C ++需要1 ms。
对于此类工作负载,在比较本机二进制编译语言与即时编译语言时,会出现的结果是什么。但请注意,当代码I / O很重时,如在您的示例中,差异将在很大程度上被否定,如果您在不同的I / O子系统中进行测试,那么具有更快I / O的代码将无论效率如何都将获胜剩下的代码。
我相信您在C ++中观察到的2000毫秒数量级结果是连接到您正在使用的控制台(Windows默认CMD.EXE?),对标准输出处理效率不高。
注意,我确实用strace
验证了在我的测试I / O中两种情况都是以类似的方式完成 - 重复调用write()
- 每行一个。例如,如果一个人正在缓冲而另一个人没有缓冲,那么它可能会产生足够大的差异,从而抵消其余代码中的速度差异。