您可以做的一件事是调用具有大量代码并在调用您正在分析的项目之间访问大量内存的函数。例如,在伪代码中(主要是语言中立的):
// loop some number of times
{
//start timing
profile_func();
//stop timing
//add to total time
large_func(); // Uses lots of memory and has lots of code
}
// Compute time of profile func by dividing number of iterations by total time
large_func() 中的代码可能是无意义的代码,就像一些反复重复的操作。关键是它或它的代码在编译时没有得到优化,因此它实际上清除了 CPU 的代码和数据缓存(以及 L2 和 L3(如果存在)缓存)。
对于许多情况来说,这是一个非常重要的测试。这很重要的原因是,经常被单独分析的小型快速函数可以运行得非常快,利用 CPU 缓存、内联和注册。但是,由于调用这些快速函数的上下文,通常在大型应用程序中没有这些优势。
例如,仅通过在紧密循环中运行一百万次迭代来分析函数可能表明该函数在 50 纳秒内执行。然后你使用我上面展示的框架运行它,突然之间它的运行时间会急剧增加到几微秒,因为它不能再利用它拥有整个处理器的事实——它的寄存器和缓存,都属于自己。