【问题标题】:Why is it faster to print to the javascript console than printing to C++ console? [closed]为什么打印到 javascript 控制台比打印到 C++ 控制台更快? [关闭]
【发布时间】:2018-04-15 11:35:19
【问题描述】:

我注意到在 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.36ms

C++

2017 毫秒 2149 毫秒 2357毫秒

谁能解释一下为什么像 C++ 这样的编译语言会比像 Javascript 这样的解释型弱类型语言慢 4 倍?我意识到我进行测试的方式可能存在问题,但我只是好奇问题可能是什么。

【问题讨论】:

  • 你是怎么编译的?请务必启用优化。
  • 显而易见的问题,您是否在启用优化的情况下进行编译?
  • 公平地说,你在 c++ 案例中比在 javascript 案例中多执行一次迭代。
  • 您是在比较浏览器控制台和终端控制台(或 C++ 程序打印的任何地方)的输出速度,而不是 JS 和 C++ 的速度。
  • "stdafx.h" 建议您在 Visual Studio 中运行它,对吗?我在 Mac 终端中测试了 C++ 版本,运行时间为 8 毫秒。同一终端中的 Node.js 版本约为 100 毫秒。在浏览器控制台中,550 毫秒。

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


【解决方案1】:

您正在两个不同的环境中对其进行测试。为了使它成为一个公平的测试,我决定在类似的环境中进行测试(同一主机,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 毫秒。

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

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

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

【讨论】:

  • 我在 Windows 10 上运行它并获得 100 毫秒,无论是从控制台还是从 VS IDE 运行。 OP 做错了什么。
  • 我使用带有 -O3 标志的 g++ 重新编译并将其缩短到 150 毫秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 2012-11-01
  • 2013-05-09
  • 2016-11-26
相关资源
最近更新 更多