对于普通的应用程序,您永远不会想要这样做.
但是……我正在制作一个教育应用程序,向人们展示不同iPhone硬件和操作系统级别上不同线程模型的确切情况. OS 4从根本上改变了不同的模型(IME:许多现有代码在OS 4上运行时不工作).
我正在编写一个交互式测试应用程序,可以让您为不同的模型(选择器主线程,选择器背景,nsoperationqueue等)启动线程,并查看GUI主应用程序发生时会发生什么.
但是我想要重现的一个常见用例是:“执行backgorund下载的线程然后执行CPU密集型结果解析”.我们在现实世界的应用程序中看到了很多.
这并非完全无足轻重; “忙碌”的方式很重要.
那么……我怎么能模拟这个呢?我正在寻找一些保证不会被优化编译器抛弃的东西(现在或者使用更好的编译器),并且足以强制线程在最大CPU上运行大约5秒.
注意:在我的真实应用程序中,我注意到当iPhone线程忙碌时会发生一些奇怪的事情 – 例如后台线程将使主线程饿死,即使设置为较低优先级.虽然这显然是Apple的线程调度程序中的一个错误,但我想忙着说明这一点 – 和/或备用忙,它显示当你不在调度程序中触发该行为时会发生什么.
更新:
例如,以下内容可能会产生不同的影响:
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 );
…有时,至少,编译器似乎优化后者(我不知道编译器巫术是什么 – 有些构建它没有显示差异,有些它做了:()
更新2:
在第一代iPhone上有25个线程,每个都有一百万个MD5 ……并且几乎没有对GUI产生明显影响.
而使用捆绑的基于SAX的解析器解析XML的5个线程通常会使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输入的来源),互斥锁或调用选择器/委托.
祝你好运,并报告你如何继续!