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

时间:2014-07-31 09:50:58

标签: c++ cout overhead

我在后台进程(unix系统上的守护进程)在某些地方的源文件上有std::cout调试。我在静音模式或无静音模式下运行此守护程序。在进程开始后的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? (不时尝试打印最多1千字节的信息)

这个开销有多大?

1 个答案:

答案 0 :(得分:2)

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

传统的解决方案是创建一个无操作的streambuf。这样做的好处是流不会变坏:只读总是看到文件末尾,输出总是有效。它的缺点是,由于流状态良好,您实际上格式化了所有输出:std::cout << someDouble将完成将double转换为字符序列的所有工作。如果流状态不好(因为它将使用nullptr作为流缓冲区),<<运算符会在尝试转换任何内容之前返回。