为什么打印到javascript控制台比打印到C++;安慰 我注意到,在C++中控制台的打印时间比JavaScript中的要长,但我本来期望相反。我用JS和C++创建了这两个fizzbuzz测试:
JS为什么打印到javascript控制台比打印到C++;安慰 我注意到,在C++中控制台的打印时间比JavaScript中的要长,但我本来期望相反。我用JS和C++创建了这两个fizzbuzz测试:,javascript,c++,performance,console,performance-testing,Javascript,C++,Performance,Console,Performance Testing,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)
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");
}
window.onload=function()
{
控制台。时间(“测试”);
对于(变量i=0;i<10001;i++)
{
如果(i%3==0&&i%5==0)
{
console.log(i+“--fizzbuzz\n”);
}
如果(i%3==0),则为else
{
console.log(i+“--fizz\n”);
}
else如果(i%5==0)
{
console.log(i+“--buzz\n”);
}
}
控制台。时间结束(“测试”);
}
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;
}
#包括“stdafx.h”
#包括
#包括
int main()
{
std::时钟未启动;
双倍持续时间;
开始=标准::时钟();
对于(int i=0;i<10001;i++)
{
如果(i%3==0&&i%5==0)
{
printf(“%d--fizzbuzz\n”,i);
}
如果(i%3==0),则为else
{
printf(“%d--fizz\n”,i);
}
else如果(i%5==0)
{
printf(“%d buzz\n”,i);
}
}
持续时间=((标准::时钟()-开始)/(双)时钟/秒);
printf(“持续时间:%f\n”,持续时间);
std::getchar();
返回0;
}
结果
JS
492.54毫秒
498.77ms
502.36毫秒
C++
2017ms
2149ms
2357ms
可以解释为什么像C++这样的编译语言比一个解释的、弱类型的语言(比如JavaScript)要慢4倍?我意识到我如何进行测试可能有问题,但我只是好奇这个问题可能是什么。您正在两个不同的环境中测试它。为了使它成为一个公平的测试,我决定在类似的环境中测试它(与
cat/proc/cpuinfo
报告的相同主机,2GHz AMD A10-6800K处理器):
Javascrtipt-在Linux上使用节点
二进制版本0.10.25,从bash提示符执行。结果在83ms左右一致。我必须删除window.onload
wrapper,否则它就是您的代码
C++-我必须删除stdafx.h中包含的stdafx.h
,才能让它进行编译。我还删除了对getchar()
的调用,因为这是不必要的。我使用默认的g++4.8.4进行编译,然后再次从bash提示符运行它。结果在10ms到20ms之间变化
当我将标准输出重定向到文件时,JavaScript在42MS中执行,而C++则使用了1毫秒
对于这种类型的工作负载,当比较本机二进制编译语言和即时编译语言时,这是一个在预期范围内的结果。但是,请注意,当代码是I/O重时,如您的示例中所示,差异将在很大程度上被抵消,并且如果您在不同的I/O子系统中进行测试,则无论其余代码的效率如何,I/O速度更快的子系统将获胜 <> P>我相信C++中观察到的2000 ms量级的结果与你正在使用的控制台(Windows默认CMD.EXE)连接,在标准输出处理中效率不高。注意,我确实用
strace
验证了在我的测试中,在这两种情况下,I/O都是以类似的方式进行的——重复调用write()
——每行一个。例如,如果一个是缓冲,而另一个不是缓冲,可能会产生很大的差异,足以抵消其余代码中的速度差异。您是如何编译的?确保优化。启用了优化的问题,你是否编译了优化?公平地说,在C++案例中,你比JavaScript案例中的迭代更多。你正在比较浏览器控制台和终端控制台(或者C++程序的任何地方)的输出速度,而不是JS和C++的速度。建议您在Visual Studio中运行此功能,对吗?我在MAC终端测试了C++版本,它运行在8毫秒。在同一终端中,NoDE.js版本大约为100毫秒。在浏览器控制台中,550毫秒我在Windows 10上运行它,得到100毫秒,无论是从控制台运行还是从VS IDE运行。OP出错了。我使用g++和-O3标志重新编译,并将其降到150毫秒。