为什么禁用中断会使代码运行得更慢?

时间:2017-03-14 19:50:17

标签: linux-kernel benchmarking

我正在对内核中运行效率do_gettimeofday()getnstimeofday()进行一些基准测试。我通过编译内核模块进行了实验,并在module_init函数中使用了以下代码:

int i;
struct timeval st, en, diff;
struct timespec s, e, dif;

do_gettimeofday(&st);
for (i = 0; i < 10000000; i++)
     do_gettimeofday(&en);
diff.tv_sec = en.tv_sec - st.tv_sec;
if (en.tv_usec < st.tv_usec) {
    diff.tv_usec = 1000000 + en.tv_usec - st.tv_usec;
    diff.tv_sec--;
}
else
    diff.tv_usec = en.tv_usec - st.tv_usec;

getnstimeofday(&s);
for (i = 0; i < 10000000; i++)
    getnstimeofday(&e);
dif = timespec_sub(e, s);

printk("do_gettimeofday: %d times in %lu.%06lu\n", i, diff.tv_sec, diff.tv_usec);
printk("getnstimeofday: %d times in %lu.%09lu\n", i, dif.tv_sec, dif.tv_nsec);

在基于AR9331的开发板上,我从dmesg获得了以下输出:

do_gettimeofday: 10000000 times in 4.452656
getnstimeofday: 10000000 times in 3.170668494

但是,如果我通过在local_irq_savelocal_irq_restore之间封闭我的代码来禁用中断,即执行以下操作

local_irq_save(flags);
...{run the above code}...
local_irq_restore(flags);

并运行上面的代码,我得到了以下输出:

do_gettimeofday: 10000000 times in 5.417230
getnstimeofday: 10000000 times in 3.661163701

据我了解,在启用中断的情况下运行代码应该延长运行时间(例如,代码运行时触发中断,CPU跳转到中断处理程序并稍后跳回)。在设备上禁用所有中断的情况下,代码运行得更慢,这感觉很奇怪。任何人都可以解释这种行为吗?

0 个答案:

没有答案