2

我有一个图形程序,我想测量某些函数调用所花费的时间。由于我不确定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
4

2 回答 2

3

简而言之,没有。

更长的答案:但是,它确实取决于,cout要去哪里,以及您实际运行的系统。

通常情况下,内部cout将使用某种“写入文件”系统调用,其中文件是“标准输出”文件句柄——如果输出被重定向,它可能是某种显示设备、窗口或文件。这当然可能导致某种中断或其他地方运行的某些进程(例如 Windows 中的“cmd.exe”或 Linux/Unix 中的“xterm”或类似的)。如果功能非常短,这种“干扰”可能足以改变结果 - 当然,您的网络浏览器也有可能醒来检查 facebook 是否有任何新项目,或者您的电子邮件软件,甚至只是来自其他系统的网络具有类似的效果。但是,在具有不错的多核处理器的现代系统中(只要系统尚未运行 100% 的 cpu 使用率),cout或任何其他潜在因素。

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

于 2013-05-09T12:33:18.053 回答
2

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

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

于 2013-05-09T12:33:53.947 回答