我正在对内核中运行效率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_save
和local_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跳转到中断处理程序并稍后跳回)。在设备上禁用所有中断的情况下,代码运行得更慢,这感觉很奇怪。任何人都可以解释这种行为吗?