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

Why is it faster to print to the javascript console than printing to C++ console?

我注意到在 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.54 毫秒 498.77毫秒 502.36 毫秒

C++

2017 毫秒 2149毫秒 2357 毫秒

谁能解释为什么 C++ 等编译型语言的执行速度比 Javascript 等解释型弱类型语言慢约 4 倍?我意识到我进行测试的方式可能存在问题,但我只是想知道问题可能是什么。

您正在两个不同的环境中测试它。为了让它成为一个公平的测试,我决定在类似的环境中进行测试(相同的主机,cat /proc/cpuinfo 报告的 2GHz AMD A10-6800K 处理器):

Javascrtipt - 在 Linux 上使用 node 二进制版本 0.10.25 从 bash 提示执行。结果在 83 毫秒左右是一致的。我不得不删除 window.onload 包装器,否则它就是你的代码。

C++ - 我必须删除包含的 stdafx.h 才能编译。我还删除了对 getchar() 的调用,因为它是不必要的。我用默认的 g++ 4.8.4 编译,然后在 bash 提示符下再次 运行 它。结果在 10 毫秒和 20 毫秒之间变化。

当我将标准输出重定向到一个文件时,Javascript 执行了 42 毫秒,而 C++ 花费了 1 毫秒。

在针对此类工作负载比较本机二进制编译语言与即时编译语言时,这个结果与人们预期的 运行ge 相差无几。但是请注意,当代码 I/O 很重时,如您的示例所示,差异将在很大程度上被抵消,并且如果您在不同的 I/O 子系统中进行测试,则具有更快 I/O 的子系统无论其余代码的效率如何,都会获胜。

我相信您在 C++ 中观察到的 2000 毫秒数量级结果连接到您正在使用的控制台(Windows 默认值 CMD.EXE?)标准输出处理效率不高.

请注意,我确实用 strace 验证了在我的测试中 I/O 的两种情况都是以类似的方式完成的 - 重复调用 write() - 每行一个。例如,如果一个缓冲而另一个不缓冲,那么它的差异可能大到足以抵消其余代码中的速度差异。