2010-07-10 50 views
4

对于一个普通的应用程序,你永远不会想这样做。强制iPhone模拟执行CPU密集型任务吗?

但是...我正在制作一个教育应用程序,以向人们展示在不同的iPhone硬件和操作系统级别的不同线程模型会发生什么。 OS 4从根本上改变了不同的模型(IME:在OS 4上运行时大量现有的代码不起作用)。我正在编写一个交互式测试应用程序,可以让你为不同的模型(选择器主线程,选择器背景,nsoperationqueue等)启动线程,并查看发生时GUI +主应用程序会发生什么。

但是我想重现的一个常见用例是:“执行backgorund下载的线程然后执行CPU密集型结果分析”。我们在真实世界的应用程序中看到了很多。

这并非完全无关紧要; “忙”的方式很重要。

那么...我怎么模拟这个?我正在寻找一些保证不会被优化编译器(现在或者更好的编译器)抛出的东西,并且足以强制线程在最大CPU上运行约5秒钟。

注意:在我的真实世界的应用程序中,我注意到当iPhone线程忙碌时会发生一些奇怪的事情 - 例如,后台线程会使主线程饿死,即使设置为低优先级。虽然这显然是Apple线程调度程序中的一个错误,但我想要做一个忙碌的事情来证明这一点 - 和/或一个忙碌的替代方案,它显示了当您不在调度程序中触发该行为时发生的情况。

UPDATE:

例如,下面可以有不同的效果:

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:

25个线程,在第一代iPhone,做的Millio每个MD5都有...并且在GUI上几乎没有可察觉的效果。

5个线程使用捆绑的基于SAX的解析器解析XML通常会使GUI停止。

看来,MD5哈希不会触发iPhone的马车线程调度:(这些问题。我要去调查MEM分配代替,看看是否有不同的效果。

+1

你刚刚说过,你想模拟一个“执行backgorund下载的线程,然后执行CPU密集型结果分析的线程”。你为什么不这样做?即下载一堆随机文件并在其上应用处理例程(如md5),但使用像100个线程。 – 5ound 2010-07-10 19:24:03

+0

@ 5ound这应该是一个答案..你会得到我的+1,如果是的话。没有人应该要求代码在没有任何工作的情况下自行构建。你的想法足以得到答案。 – Jann 2010-07-10 22:27:45

+0

Jann - 它不起作用(我认为它不那么简单)。这个理论是微不足道的,但实践是什么让我难过:) – Adam 2010-07-10 23:06:47

回答

1

你能避免编译器优化东西拿走通过确保编译器不能轻易地推断出你想在编译的时候做什么

例如,这样的:

for(int i=0; i<1000000; i++) 
    CC_MD5(cStr, strlen(cStr), result); 

有一个不变的输入,所以编译器可能会意识到它会得到sa我每次都会有结果。或者结果没有被使用,所以它不需要计算它。 你可以同时避免这些问题,像这样:

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输入的来源),互斥锁或调用选择器/委托。

祝你好运,并做你的回报!

+0

是的,这是个好主意,谢谢。我会尝试在交替循环中翻转它们,然后在循环之后进行nslog操作,以保持编译器不会进行优化。 – Adam 2010-07-12 20:52:37

1

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

+0

我以前没有发现过这个例子 - 很好找,谢谢! – Adam 2010-07-12 20:50:47