代码之家  ›  专栏  ›  技术社区  ›  Adam

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

  •  4
  • Adam  · 技术社区  · 14 年前

    我正在编写一个交互式测试应用程序,它允许您为不同的模型(选择器主线程、选择器背景、nsoperationqueue等)启动线程,并查看GUI+主应用程序在运行时发生了什么。

    但我想重现的一个常见用例是:“执行backgorund下载的线程然后对结果进行CPU密集型解析”。我们在现实世界的应用程序中经常看到这一点。

    这并不完全是小事;“忙碌”的方式很重要。

    那么…我该怎么模拟呢?我正在寻找一种保证不会被优化编译器(无论是现在还是使用更好的编译器)丢弃的东西,它足以迫使线程在最大CPU下运行大约5秒。

    更新:

    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:

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

    MD5哈希似乎不会引发iPhone有缺陷的线程调度程序中的问题:(。我将研究内存分配,看看这是否有不同的影响。

    2 回复  |  直到 14 年前
        1
  •  1
  •   JosephH    14 年前

    通过确保编译器不能轻易推断您在编译时要做的事情,您可以避免编译器对事情进行优化。

    例如:

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

    祝你好运,一定要报告你的进展!

        2
  •  1
  •   schellack    14 年前

    事实上,苹果提供的示例代码与您正在寻找的类似 developer.apple.com