为什么C++输出比C慢得多?

14

我实际上是C++的粉丝,但今天我发现我的程序文件输出非常缓慢。因此,我设计了一个实验来比较C++文件输出和C的速度。 假设我们有这段代码:

int Num = 20000000;
vector <int> v;
for ( int i = 0; i < Num; i++ )
{
    v.push_back(i);
}

现在我运行两个不同的代码,其中一个是用C++编写的:

int now = time(0);
cout << "start" << endl;
ofstream fout("c++.txt");
for(size_t i = 0; i < v.size(); ++i)
{
    fout<< v[i] << endl;
}
fout.close();
cout << time(0) - now << endl;

还有一个是 C 语言:

int now = time(0);
printf("start\n");
FILE *fp = fopen("c.txt", "w");
for(size_t i = 0; i < v.size(); ++i)
{
    fprintf(fp, "%d\n", v[i]);
}
fclose(fp);
printf("%ld\n", time(0) - now);

C++程序运行速度惊人地慢! 在我的系统上,C程序运行需要3秒钟,而C++程序却需要约50秒钟才能运行! 这有什么合理的解释吗?


3
哪些优化已启用? - Chad
6
如果你正在使用向量,那么两者都是C++。只不过你在C++中使用的是旧的C样式库。 - Keith Nicholas
如果你真的想知道,可以在编译器中使用-S选项来查看汇编文件。 - aaronman
1
相关链接:https://dev59.com/W-o6XIcBkEYKwwoYTS1D,有更好的链接,但我暂时找不到了... - Mysticial
4
应该是 fout<< v[i] << "\n"; - Mikhail
1
可能会成为一个很好的示例问题,用于教授初学者 endl 是有害的(如果还没有这样的问题)。已收藏。 - Christian Rau
1个回答

27

可能是由于在C++代码中过于频繁地将流刷新到磁盘。将endl插入到流中会插入一个新行并刷新缓冲区,而fprintf不会导致缓冲区刷新。

因此,您的C++示例执行20,000,000次缓冲区刷新,而您的C示例仅在文件句柄的缓冲区满时才会刷新到磁盘。


我同意 - 这正是问题所在。 - rohitsan
谢谢您的回复。那么,我该如何更改C++代码,以使其不执行太多的缓冲区刷新操作? 当然,我需要这个endl。那我该怎么办? - Ehsan Haghshenas
4
@user2345493,您不需要使用 endl,可以使用 "\n"代替。请参考 https://dev59.com/rnVC5IYBdhLWcg3wsTRi。 - shf301
1
是的,你说得完全正确。 我已经修改了它,而且速度也很快。谢谢你的帮助 ;) - Ehsan Haghshenas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接