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

时间:2017-07-04 18:31:16

标签: c++ linux bash

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

这是bash脚本:

>>> import asgi_redis
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/app/.heroku/python/lib/python2.7/site-packages/asgi_redis/__init__.py", line 1
, in <module>
    from .core import RedisChannelLayer
  File "/app/.heroku/python/lib/python2.7/site-packages/asgi_redis/core.py", line 10, i
n <module>
    from redis._compat import b
ImportError: No module named _compat

每秒向文本文件添加大约2-3 KB。

这是C ++代码:

#!/bin/bash

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

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

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

3 个答案:

答案 0 :(得分:40)

有几个原因。

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

其次,请注意碎片你的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 ++中实现流的更多信息,以及为什么\nendl不同,请参阅有关C ++的任何参考文档。

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

答案 1 :(得分:6)

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

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

将邮件写入10k次,但只打开一次日志。

答案 2 :(得分:-3)

Compiled vs. Interpreted Languages

在编译C ++时解释Bash。只是这样可以加快速度