【发布时间】:2010-01-23 11:35:57
【问题描述】:
这个程序:
#include <iostream>
#include <cstdlib>
#include <string>
int main(int argc, const char *argv[])
{
using ::std::cerr;
using ::std::cout;
using ::std::endl;
if (argc < 2 || argc > 3) {
cerr << "Usage: " << argv[0] << " [<count>] <message>\n";
return 1;
}
unsigned long count = 10000;
if (argc > 2) {
char *endptr = 0;
count = ::std::strtoul(argv[1], &endptr, 10);
if ((argv[1][0] == '\0') || (*endptr != '\0')) {
cerr << "Usage: " << argv[0] << " [<count>] <message>\n";
return 1;
}
}
const ::std::string msg((argc < 3) ? argv[1] : argv[2]);
for (unsigned long i = 0; i < count; ++i) {
cout << i << ": " << msg << '\n';
}
return 0;
}
当这样计时:
$ time ./joe 10000000 fred >/dev/null
real 0m15.410s
user 0m10.551s
sys 0m0.166s
执行需要 15.4 秒的实时时间。用这个替换输出行:cout << i << ": " << msg << endl;,你最终会得到这样的结果:
$ time ./joe 10000000 fred >/dev/null
real 0m39.115s
user 0m16.482s
sys 0m15.803s
如您所见,运行时间增加了一倍多,并且程序从在操作系统中花费的时间最短变为在操作系统中花费了将近一半的时间。
两个版本的程序具有相同的输出,并且由标准保证在每个平台上具有相同的输出。
鉴于此,为什么人们坚持使用endl作为'\n'?的同义词
编辑:如果不是很明显,这个问题旨在成为一个引导性问题,并用于教学目的。我知道为什么会存在性能损失。
【问题讨论】:
-
你能告诉我标准的哪一部分保证输出在所有平台上都是相同的吗?
标签: c++ performance iostream