我在后台进程(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千字节的信息)
这个开销有多大?
答案 0 :(得分:2)
显然有一些开销。但并不多;每个<<
中的第一件事就是测试流状态是否良好。并且如果相应的物理设备关闭,则不应该。至少,它会在第一次刷新后变坏(由于缓冲区变满)。或者,您可以致电std::cout.rdbuf( nullptr )
,这会使其立即变坏。
传统的解决方案是创建一个无操作的streambuf。这样做的好处是流不会变坏:只读总是看到文件末尾,输出总是有效。它的缺点是,由于流状态良好,您实际上格式化了所有输出:std::cout << someDouble
将完成将double转换为字符序列的所有工作。如果流状态不好(因为它将使用nullptr
作为流缓冲区),<<
运算符会在尝试转换任何内容之前返回。