我正在分析Linux系统上的一些代码(在Intel Core i7 4500U上运行)以获得执行成本的时间。 该应用程序是来自libmpeg2的demo mpeg2dec。 我正在尝试获取mpeg2执行时间的概率分布。 但是,我们希望看到cachingclosures时的原始执行成本。
有没有办法通过Linux命令或通过gcc标志禁用我的系统的cpucaching? 甚至将cpu(L1 / L2)caching大小设置为0KB? 甚至添加一些代码更改为禁用caching? 当然,不用修改或重build内核。
看到这个2012线程,有人发布了一个微小的内核模块源,通过asm禁用缓存。
http://www.linuxquestions.org/questions/linux-kernel-70/disabling-cpu-caches-936077/
如果禁用缓存确实是必要的,那就这样吧。
否则,要知道一个过程在用户或系统“周期”方面需要多少时间,那么我会推荐getrusage()
函数。
struct rusage usage; getrusage(RUSAGE_SELF, &usage);
您可以在循环/测试之前/之后调用它,并减去这些值,以便了解进程花费了多少时间,即使许多其他进程在同一台机器上并行运行也是如此。 你会得到的主要问题是如果你的过程开始交换。 在这种情况下,你的时间将会关闭。
double user_usage = usage.ru_utime.tv_sec + usage.ru_utime.tv_usec / 1000000.0; double system_uage = usage.ru_stime.tv_sec + usage.ru_stime.tv_usec / 1000000.0;
从我自己的经验来看,这确实很精确。 为了提高精度,你可以在运行你的测试时做root,并给它一个负的优先级(-1或-2就足够了)。然后在你调用一个可能需要它的函数之前它不会被换出。
当然,你仍然可以得到缓存的效果……假设你不用处理大量的数据(而不是循环)。