C++比写入文本文件的Bash脚本快得多

obl*_*obl 17 c++ linux bash

我想测试在bash脚本和C++程序中写入文件的性能.

这是bash脚本:

#!/bin/bash

while true; do
        echo "something" >> bash.txt
done
Run Code Online (Sandbox Code Playgroud)

这每秒向文本文件添加大约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();
}
Run Code Online (Sandbox Code Playgroud)

这在不到10秒的时间内创建了一个~6 GB的文本文件.

是什么让这个C++代码更快,和/或这个bash脚本这么慢?

ieh*_*ich 39

有几个原因.

首先,解释执行环境(如bash,perl沿着与非JIT编译luapython等)一般是多少慢甚至写得不好的编译程序(C,C++,等).

其次,请注意您的bash代码是多么碎片化 - 它只是将一行写入文件,然后再写一行,依此类推.另一方面,您的C++程序执行缓冲写入 - 即使您没有直接努力.您可能会看到如果替换它会运行得多慢

myfile << "Writing this to a file Writing this to a file \n";
Run Code Online (Sandbox Code Playgroud)

myfile << "Writing this to a file Writing this to a file" << endl;
Run Code Online (Sandbox Code Playgroud)

有关如何在C++中实现流的更多信息,以及为什么\n不同endl,请参阅有关C++的任何参考文档.

第三,正如评论所证明的那样,您的bash脚本会为每一行执行目标文件的打开/关闭.这意味着显着的性能开销本身 - 想象myfile.openmyfile.close移动到循环体内!

  • 将性能降低到耗尽是一个很好的开始.下一步是打开文件以追加并在每个循环上关闭它.应该更加接近. (3认同)
  • IIRC,`bash`行必须每次都被翻译/"构建"为原生.对于只编译一次的`perl`或编译为字节代码的`python`,情况并非如此.`Bash`在它即将运行之前不会构建一条线,而`perl`会在开始时构建所有内容,等等. (2认同)

Ell*_*sch 6

正如其他人已经指出的那样,这是因为您正在使用在脚本中编写的每一行打开和关闭文件(并且在编译C++时解释shell脚本).例如,您可以批量写入并写入一次

MSG="something"
logfile="test.txt"
(
for i in {1..10000}; do
        echo $MSG
done
) >> $logfile
Run Code Online (Sandbox Code Playgroud)

这将写入消息10k次,但只打开一次日志.