首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++比Bash脚本编写文本文件快得多

C++比Bash脚本编写文本文件快得多
EN

Stack Overflow用户
提问于 2017-07-04 18:31:16
回答 3查看 4.5K关注 0票数 17

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

下面是bash脚本:

代码语言:javascript
复制
#!/bin/bash

while true; do
        echo "something" >> bash.txt
done

这增加了大约2-3 KB的文本文件每秒.

以下是C++代码:

代码语言:javascript
复制
#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脚本如此之慢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-04 18:37:06

这有几个原因。

首先,解释执行环境(如bashperl以及非JITed luapython等)通常比编写得很差的编译程序(CC++等)慢得多。

其次,请注意bash代码是多么的零碎-它只是将一行写到一个文件中,然后再写一条,以此类推。另一方面,您的C++程序执行缓冲的写入--即使没有您的直接努力。你可能会发现如果你用

代码语言:javascript
复制
myfile << "Writing this to a file Writing this to a file \n";

使用

代码语言:javascript
复制
myfile << "Writing this to a file Writing this to a file" << endl;

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

第三,正如注释所证明的那样,bash脚本为每一行执行目标文件的打开/关闭。这本身就意味着很大的性能开销--假设myfile.openmyfile.close在您的循环体内移动!

票数 39
EN

Stack Overflow用户

发布于 2017-07-05 03:33:24

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

代码语言:javascript
复制
MSG="something"
logfile="test.txt"
(
for i in {1..10000}; do
        echo $MSG
done
) >> $logfile

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

票数 6
EN

Stack Overflow用户

发布于 2017-07-04 18:36:53

Compiled vs. Interpreted Languages

在编译C++时解释Bash。只是这样就快多了

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44912276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档