为什么打印到javascript控制台比打印到C ++控制台更快?

时间:2017-11-02 20:12:07

标签: javascript c++ performance console performance-testing

我注意到在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倍?我意识到我的测试方式可能存在问题,但我只是对这个问题的原因感到好奇。

1 个答案:

答案 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() - 每行一个。例如,如果一个人正在缓冲而另一个人没有缓冲,那么它可能会产生足够大的差异,从而抵消其余代码中的速度差异。