我想测试在bash脚本和C++程序中编写文件的性能。
下面是bash脚本:
#!/bin/bash
while true; do
echo "something" >> bash.txt
done这增加了大约2-3 KB的文本文件每秒.
以下是C++代码:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream myfile;
myfile.open("cpp.txt");
while (true) {
myfile << "Writing this to a file Writing this to a file \n";
}
myfile.close();
}这在10秒钟内创建了一个~6 GB的文本文件。
是什么使这个C++代码如此快,和/或这个bash脚本如此之慢?
发布于 2017-07-04 18:37:06
这有几个原因。
首先,解释执行环境(如bash、perl以及非JITed lua和python等)通常比编写得很差的编译程序(C、C++等)慢得多。
其次,请注意bash代码是多么的零碎-它只是将一行写到一个文件中,然后再写一条,以此类推。另一方面,您的C++程序执行缓冲的写入--即使没有您的直接努力。你可能会发现如果你用
myfile << "Writing this to a file Writing this to a file \n";使用
myfile << "Writing this to a file Writing this to a file" << endl;有关如何在C++中实现流以及为什么\n不同于endl的更多信息,请参见关于C++的任何参考文档。
第三,正如注释所证明的那样,bash脚本为每一行执行目标文件的打开/关闭。这本身就意味着很大的性能开销--假设myfile.open和myfile.close在您的循环体内移动!
发布于 2017-07-05 03:33:24
正如其他人已经指出的那样,这是因为您目前正在打开和关闭文件,在脚本中编写每一行(编译C++时解释shell脚本)。例如,您可以对写入进行批次处理并编写一次。
MSG="something"
logfile="test.txt"
(
for i in {1..10000}; do
echo $MSG
done
) >> $logfile它将写入消息10k次,但只打开日志一次。
发布于 2017-07-04 18:36:53
Compiled vs. Interpreted Languages
在编译C++时解释Bash。只是这样就快多了
https://stackoverflow.com/questions/44912276
复制相似问题