我正在尝试优化 iOS 上的一个函数(一个 FFT),并且我已经设置了一个测试程序来计时它的执行时间超过数百次调用。我在函数调用之前和之后使用 mach_absolute_time() 来计时。我正在运行 iOS 6 的第 4 代 iPod touch 上进行测试。
大多数计时结果彼此大致一致,但有时一次运行会比其他运行花费更长的时间(长达 100 倍)。
我很确定这与我的实际功能无关。每次运行都有相同的输入数据,并且是纯数值计算(即没有系统调用或内存分配)。如果我用一个空的 for 循环替换 FFT,我也可以重现这一点。
有没有其他人注意到这样的事情?
我目前的猜测是我的应用程序的线程以某种方式被操作系统中断。如果是这样,有什么办法可以防止这种情况发生吗?(这不是将在 App Store 上发布的应用程序,因此非公共 API 可以解决此问题。)
我不再拥有 iOS 5.x 设备,但我很确定这在更新到 iOS 6 之前不会发生。
编辑:这是一种更简单的重现方法:
for (int i = 0; i < 1000; ++i)
{
uint64_t start = mach_absolute_time();
for (int j = 0; j < 1000000; ++j);
uint64_t stop = mach_absolute_time();
printf("%llu\n", stop-start);
}
在调试中编译它(因此不会优化 for 循环)并运行;大多数值都在 220000 左右,但有时值会大 10 倍或更多。