gpt4 book ai didi

c++ - 混合 cout 和 printf 以获得更快的输出

转载 作者:IT老高 更新时间:2023-10-28 13:57:51 27 4
gpt4 key购买 nike

在执行了一些测试后,我注意到 printfcout 快得多。我知道它依赖于实现,但在我的 Linux 机器上 printf 快 8 倍。所以我的想法是混合两种打印方法:我想使用 cout 进行简单的打印,我计划使用 printf 来产生巨大的输出(通常在循环中) .只要在切换到其他方法之前不要忘记刷新,我认为这样做是安全的:

cout << "Hello" << endl;
cout.flush();

for (int i=0; i<1000000; ++i) {
printf("World!\n");
}
fflush(stdout);

cout << "last line" << endl;
cout << flush;

这样可以吗?

更新:感谢所有宝贵的反馈。答案摘要:如果您想避免棘手的解决方案,只需坚持使用 cout 但不要使用 endl 因为它会隐式刷新缓冲区(减慢进程)。请改用 "\n"。如果您产生 large 输出会很有趣。

最佳答案

直接的回答是可以,没关系。

很多人就如何提高速度提出了各种想法,但对于哪种方法最有效似乎存在相当多的分歧。我决定编写一个快速测试程序,以至少了解哪些技术做了什么。

#include <iostream>
#include <string>
#include <sstream>
#include <time.h>
#include <iomanip>
#include <algorithm>
#include <iterator>
#include <stdio.h>

char fmt[] = "%s\n";
static const int count = 3000000;
static char const *const string = "This is a string.";
static std::string s = std::string(string) + "\n";

void show_time(void (*f)(), char const *caption) {
clock_t start = clock();
f();
clock_t ticks = clock()-start;
std::cerr << std::setw(30) << caption
<< ": "
<< (double)ticks/CLOCKS_PER_SEC << "\n";
}

void use_printf() {
for (int i=0; i<count; i++)
printf(fmt, string);
}

void use_puts() {
for (int i=0; i<count; i++)
puts(string);
}

void use_cout() {
for (int i=0; i<count; i++)
std::cout << string << "\n";
}

void use_cout_unsync() {
std::cout.sync_with_stdio(false);
for (int i=0; i<count; i++)
std::cout << string << "\n";
std::cout.sync_with_stdio(true);
}

void use_stringstream() {
std::stringstream temp;
for (int i=0; i<count; i++)
temp << string << "\n";
std::cout << temp.str();
}

void use_endl() {
for (int i=0; i<count; i++)
std::cout << string << std::endl;
}

void use_fill_n() {
std::fill_n(std::ostream_iterator<char const *>(std::cout, "\n"), count, string);
}

void use_write() {
for (int i = 0; i < count; i++)
std::cout.write(s.data(), s.size());
}

int main() {
show_time(use_printf, "Time using printf");
show_time(use_puts, "Time using puts");
show_time(use_cout, "Time using cout (synced)");
show_time(use_cout_unsync, "Time using cout (un-synced)");
show_time(use_stringstream, "Time using stringstream");
show_time(use_endl, "Time using endl");
show_time(use_fill_n, "Time using fill_n");
show_time(use_write, "Time using write");
return 0;
}

在使用 VC++ 2013(x86 和 x64 版本)编译后,我在 Windows 上运行了它。一次运行的输出(输出重定向到磁盘文件)如下所示:

          Time using printf: 0.953
Time using puts: 0.567
Time using cout (synced): 0.736
Time using cout (un-synced): 0.714
Time using stringstream: 0.725
Time using endl: 20.097
Time using fill_n: 0.749
Time using write: 0.499

不出所料,结果各不相同,但有几点我觉得很有趣:

  1. 在写入 NUL 设备时,printf/puts 比 cout 快得多
    • 但是 cout 在写入真实文件时保持得很好
  2. 不少建议的优化措施收效甚微
    • 在我的测试中,fill_n 的速度几乎和其他任何东西一样快
  3. 目前最大的优化是避免 endl
  4. cout.write 给出了最快的时间(尽管可能差距不大

我最近编辑了代码以强制调用 printf。 Anders Kaseorg 好心指出——g++ 识别特定序列 printf("%s\n", foo); 等价于 puts( foo);,并相应地生成代码(即生成代码以调用 puts 而不是 printf)。将格式字符串移动到全局数组,并将其作为格式字符串传递会产生相同的输出,但会强制它通过 printf 而不是 puts 产生。当然,他们也有可能会在某一天对此进行优化,但至少现在(g++ 5.1)用 g++ -O3 -S 进行的测试确认它实际上是在调用 printf(之前的代码编译为对 puts 的调用)。

关于c++ - 混合 cout 和 printf 以获得更快的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1924530/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com