对于普通应用程序,您永远不想这样做。
但是......我正在制作一个教育应用程序,向人们展示不同的线程模型在不同的 iPhone 硬件和操作系统级别上到底会发生什么。 OS 4 从根本上改变了不同的模型(IME:许多现有代码在 OS 4 上运行时不起作用)。
我正在编写一个交互式测试应用程序,可让您为不同模型(选择器主线程、选择器背景、nsoperationqueue 等)触发线程,并查看 GUI + 主应用程序在发生时会发生什么情况。
但我想要重现的常见用例之一是:“执行后台下载的线程,然后对结果进行 CPU 密集型解析”。我们在现实应用程序中经常看到这种情况。
这并不完全是微不足道的; “忙碌”的方式很重要。
那么...我怎样才能模拟这个呢?我正在寻找一种保证不会被优化编译器丢弃的东西(无论是现在,还是使用更好的编译器),并且足以强制线程以最大 CPU 运行大约 5 秒。
注意:在我的实际应用程序中,我注意到当 iPhone 线程繁忙时会发生一些奇怪的事情 - 例如即使设置为较低优先级,后台线程也会导致主线程饥饿。虽然这显然是苹果线程调度程序中的一个错误,但我想制作一个忙碌来演示这一点 - 和/或另一个忙碌来显示当您不在调度程序中触发该行为时会发生什么。
更新:
例如,以下内容可能会产生不同的效果:
for( int i=0; i<1000; i++ )
for( int k=0; k<1000; k++ )
CC_MD5( cStr, strlen(cStr), result );
for( int i=0; i<1000000; i++ )
CC_MD5( cStr, strlen(cStr), result );
...有时,至少,编译器似乎优化了后者(我不知道编译器 voodoo 的用途是什么 - 有些构建没有显示任何差异,有些则有:()
更新2:
在第一代 iPhone 上有 25 个线程,每个线程执行一百万个 MD5...并且对 GUI 几乎没有明显的影响。
而使用捆绑的基于 SAX 的解析器的 5 个线程解析 XML 通常会使 GUI 停止运行。
MD5 散列似乎不会触发 iPhone 有缺陷的线程调度程序中的问题:(。我将研究内存分配,看看是否有不同的效果。
最佳答案
您可以通过确保编译器无法轻易推断您在编译时要执行的操作来避免编译器优化某些内容。
例如:
for( int i=0; i<1000000; i++ )
CC_MD5( cStr, strlen(cStr), result );
具有不变的输入,因此编译器可以意识到每次都会得到相同的结果。或者结果没有被使用,所以不需要计算它。 您可以像这样避免这两个问题:
for( int i=0; i<1000000; i++ )
{
CC_MD5( cStr, strlen(cStr), result );
sprintf(cStr, "%02x%02x", result[0], result[1]);
}
如果您发现 SAX 存在问题,那么我会首先让您的模拟应用程序中的线程执行 SAX,并检查您是否在主应用程序之外看到了相同的问题。
如果问题与纯粹的处理器能力或内存分配无关,您可以查看的其他方面是磁盘 I/O(取决于您的 xml 输入来自何处)、互斥体或调用选择器/委托(delegate)。
祝你好运,并报告你的进展情况!
关于iphone - 强制 iPhone 模拟执行 CPU 密集型任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3220486/