如果关闭std::cout开销(STDIN_FILENO)



我有后台进程(unix系统上的守护进程),在某些地方对源文件进行std::cout调试。我在静音模式或NO静音模式下运行这个守护进程。在进程启动后的silence mode上,我执行这段代码:

std::cout.rdbuf(0);
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);   

正如你所理解的,std::cout仍然存在于代码中并运行。

NON silence mode上有很大的开销,而cout到屏幕是非常昂贵和缓慢的IO操作。

: silence mode上的代码开销是多少?由于std::cout存在,但STDOUT_FILENO关闭,我的程序是否有一些"拖拽"?(有时它会尝试打印多达1kb的信息)

这个开销有多大?

显然有一些开销。但不多;每个<<的第一件事是测试流状态是否良好。如果相应的物理设备处于关闭状态,则不应该是。至少,它会在第一次刷新后出现问题(由于缓冲区已满)。或者,您可以调用std::cout.rdbuf( nullptr ),这应该会使它立即变坏。

传统的解决方案是创建一个无操作流。这样做的好处是流不会出错:读取总是看到文件结束,输出总是工作。它的缺点是,由于流状态良好,您实际上格式化了所有输出:std::cout << someDouble将完成将双精度数转换为字符序列的所有工作。如果流状态不好(就像nullptr作为流缓冲区时一样),<<操作符在尝试转换任何内容之前返回。

相关内容

  • 没有找到相关文章

最新更新