Stack Overflow上的this answer和cppreference.com都建议关闭流同步以提高性能,并认为流同步会禁用缓冲。
现在这是我不明白的。为什么不能同步流只是共享缓冲区?我想如果流是同步的,std::fputc(stdout, c);
可以简单地用std::cout << c;
或相反的方式(或使用公共原语)来实现。因此,每当C I / O与C ++ I / O混合时,同步流甚至比非同步流更有优势!缓冲区更少,缓存未命中次数更少。
目前的C ++标准草案似乎与我在这里。在指定sync_with_stdio()
的脚注中,它表示&#34;实际上,同步通常意味着标准的iostream对象和标准的stdio对象共享缓冲区。&#34;我上面发布的链接是否可能只记录了一些不完善的实现及其性能影响?
另外,因为我没有看到非同步流的任何理论上的缺点,我想知道为什么这些存在于第一位。
答案 0 :(得分:0)
std::fputc(stdout, c);
可以简单地以std::cout << c;
或相反的方式实现(或使用通用原语)
实际上是“反过来”。同步std::cout
是一个无缓冲的流,每个std::cout << c;
立即执行std::fputc(stdout, c);
。
同步流甚至比非同步流更有优势!缓冲区更少,缓存未命中次数更少
它只是一个缓冲区:stdout
在同步时或std::cout
时没有。在我的gcc / libstdc ++上,主要区别在于一个是1024字节而另一个是8191(严重)。分析标准库的三个现有实现(libstdc ++,libc ++和MSVC)以发现差异以及导致它们的原因可能会很有趣。很可能它们是“不完美的实现” - 没有理由不同步std::cout << c;
应该比(总是同步的)std::fputc(stdout, c);
慢。
答案 1 :(得分:0)