std :: cout会影响计时器吗?

时间:2013-05-09 12:26:41

标签: c++ performance timing cout

我有一个图形程序,我想测量某些函数调用的时间。由于我不确定std::cout如何在幕后工作,我想询问在定时器调用之间调用它是否会影响性能。我知道它本身很慢所以我自然不会把它放在我正在测量的函数中,但它是缓冲/异步的,这样在调用以任何方式返回之后效果会停留吗?我希望做这样的事情(伪代码):

timer->Start();
RunSomeFunction();
timer->Stop();
std::cout << timer << std::endl; // Could this affect the next timer event?
timer->Start();
RunAnotherFunction();
timer->Stop();
std::cout << timer << std::endl;
// etc

2 个答案:

答案 0 :(得分:3)

简而言之,没有。

更长的回答:但是,它确实依赖于cout将要发生的地方以及您实际运行的系统。

通常,cout的内部将使用某种“写入文件”系统调用,其中file是“标准输出”文件句柄 - 可能是某种显示设备,窗口或文件如果输出被重定向。这当然可能导致某种中断或某些其他运行的进程(例如Windows中的“cmd.exe”或Linux / Unix中的“xterm”或类似内容)。如果功能非常短,这种“干扰”可能足以改变结果 - 当然,您的网络浏览器也可能会醒来检查Facebook是否有任何新项目,或您的电子邮件软件,甚至只是来自其他系统的网络也有类似的效果。然而,在具有合适的多核处理器的现代系统中(只要系统尚未运行100%的CPU使用率),这些影响应该相当小,并且实际上并不是很重要 - 无论我们是否正在谈论{{1或任何其他潜在因素。

编辑:此外,对于非常敏感的代码,调用cout(或任何其他超过几行的函数[或循环读取大块内存,即使几行]的效果)会影响缓存内容,这可能会影响代码的执行。

答案 1 :(得分:2)

从技术上讲,std::cout(以及大多数函数)可能会导致某些RAM页面被换出,或填充OS的缓冲区,或者以某种其他方式为OS创建额外的负载。但这不应该引人注意。

任何其他(异步)工作,无论是在您的进程内还是在OS内核中,都将在另一个线程中执行,因此您的程序不会受到太多影响(前提是您有一个多核CPU并且您的系统处于空闲状态) )。