强制iPhone模拟CPU密集型任务?

时间:2010-07-10 19:09:22

标签: iphone performance multithreading networking

对于普通应用,您永远不会想要这样做。

但是......我正在制作一个教育应用,向人们展示不同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的错误线程调度程序中的问题:(。我将调查内存分配,看看是否有不同的效果。

2 个答案:

答案 0 :(得分:1)

您可以通过确保编译器无法轻易地推断出您在编译时尝试执行的操作来避免编译器优化。

例如,这个:

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输入来自哪里),互斥锁或调用选择器/代理。

祝你好运,并报告你如何继续!

答案 1 :(得分:1)

Apple实际上提供的示例代码与您在developer.apple.com处寻找的内容类似,旨在强调使用LibXML(SAX)和CocoaXML之间的性能差异。重点不在于CPU性能,但假设您可以实际测量处理器利用率,您可能只需按比例放大(在xml中重复)样本下载的数据集。