为什么打印到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.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()
——每行一个。例如,如果一个是缓冲区,而另一个不是,那么它可能会产生足够大的差异,从而抵消代码其余部分的速度差异。
- c ++控制台应用程序,如何在控制台外部打印字符
- 控制台打印时间功能产生1
- 如何通过按 F2 或 F3 等键使控制台打印某些内容
- cout 不打印任何内容到控制台
- 如何在 C++ 中将 U32 字符串和 U16string 打印到控制台
- 打印到文件和控制台 C++
- 在 c++ 中打印到控制台的最佳方式是什么?
- 我的控制台正在打印随机单词以及没有执行正确的数学运算
- C++控制台打印在同一行上,带回车符
- 硬编码字符串与强制转换为 PUCHAR 并打印到控制台时从控制台读取的字符串的结果不同
- V8 控制台.log不打印
- 使用 C++ shell 为 C++ 中的 2 D 动态数组赋值,控制台不会打印出任何内容
- cURL 保持打印传输到控制台?
- SDL 未打印到控制台
- qDebug() 在升级到 ubuntu 17.10(和 Fedora)后停止工作(不再打印到控制台)
- 使用具有 UTF8 编码的源文件将 UTF8 符号打印到 Windows 控制台
- Eclipse C 控制台打印订单Linux
- 基本的控制台打印程序
- istream导致控制台打印加倍
- 使用 Libtcod,如何控制台>打印具有动态颜色量的字符串?