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

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

本文关键字:控制台 打印 C++ javascript 为什么      更新时间:2023-10-16

我注意到,在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毫秒2357ms

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

您正在两个不同的环境中测试它。为了使它成为一个公平的测试,我决定在类似的环境中测试它(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++需要1ms。

对于这种类型的工作负载,当比较本机二进制编译语言与实时编译语言时,结果将在预期范围内。然而,请注意,当代码的I/O量很大时,如您的示例中所示,差异将在很大程度上被抵消,如果您在不同的I/O子系统中进行测试,则无论代码其余部分的效率如何,I/O速度更快的子系统都将获胜。

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

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