#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>
int main(int argc, char* argv[])
{
std::clock_t start;
double duration;
std::cout << "Starting std::cout test." << std::endl;
start = std::clock();
for (int i = 0; i < 1000; i++)
{
std::cout << "Hello, World! (" << i << ")" << std::endl;
}
duration = (std::clock() - start) / (double) CLOCKS_PER_SEC;
std::cout << "Ending std::cout test." << std::endl;
std::cout << "Time taken: " << duration << std::endl;
std::system("pause");
std::cout << "Starting std::printf test." << std::endl;
start = std::clock();
for (int i = 0; i < 1000; i++)
{
std::printf("Hello, World! (%i)\n", i);
std::fflush(stdout);
}
duration = (std::clock() - start) / (double) CLOCKS_PER_SEC;
std::cout << "Ending std::printf test." << std::endl;
std::cout << "Time taken: " << duration << std::endl;
system("pause");
return 0;
}
现在,这里是前五次运行的时间:
std::cout
测试:1.125秒;printf
测试:0.195秒std::cout
测试:1.154秒;printf
测试:0.230秒std::cout
测试:1.142秒;printf
测试:0.216秒std::cout
测试:1.322秒;printf
测试:0.221秒std::cout
测试:1.108秒;printf
测试:0.232秒
正如您所看到的,使用printf
再加上刷新操作fflush
的时间约为使用std::cout
的5倍少。
虽然我确实预计使用std::cout
的<<
操作可能会略微慢一些(几乎可以忽略不计),但我没有料到会有如此巨大的差异。我做的测试公平吗?如果是这样,那么第一个测试比第二个测试慢这么多,如果它们本质上做了完全相同的事情,是什么原因呢?
std::cout << "Hello, World! (" << i << ")" << std::endl;
包含 4 次函数调用,而printf
只有一次。尝试像使用cout
那样使用printf
进行 5 次打印,并观察发生了什么。你会意识到性能损失中有多少是由于函数调用,以及库本身造成的影响。 - Shahbazstd::cout.sync_with_stdio(false);
。 - Martin Yorkprintf
刷新stdout
是相当不公平的。没有std::fflush(stdout);
,printf
循环执行得更快。虽然使用<< std::endl
是惯用法,但使用fflush(stdout)
却不是惯用法。毫无戒心的 C++ 程序员很可能会比使用stdout
更低效地使用cout
。 - chqrlie