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

2024-01-16

对于普通的应用程序,您永远不想这样做。

但是......我正在制作一个教育应用程序,向人们展示不同的线程模型在不同的 iPhone 硬件和操作系统级别上到底会发生什么。 OS 4 从根本上改变了不同的模型(IME:许多现有代码在 OS 4 上运行时不起作用)。

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

但我想要重现的常见用例之一是:“执行后台下载的线程,然后对结果进行 CPU 密集型解析”。我们在现实应用程序中经常看到这种情况。

这并不完全是微不足道的。 “忙碌”的方式很重要。

那么...我怎样才能模拟这个呢?我正在寻找一种保证不会被优化编译器丢弃的东西(无论是现在,还是使用更好的编译器),并且足以强制线程以最大 CPU 运行大约 5 秒。

注意:在我的实际应用程序中,我注意到当 iPhone 线程繁忙时会发生一些奇怪的事情 - 例如即使设置为较低优先级,后台线程也会导致主线程饥饿。虽然这显然是苹果线程调度程序中的一个错误,但我想制作一个忙碌来演示这一点 - 和/或另一个忙碌来显示当您不在调度程序中触发该行为时会发生什么。

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 );

...有时,至少,编译器似乎优化了后者(而且我不知道编译器 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 输入来自何处)、互斥体或调用选择器/委托。

祝你好运,并报告你的进展情况!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强制 iPhone 模拟执行 CPU 密集型任务? 的相关文章

  • 如何从装有 iOS 5 的新 iPhone(供个人使用)获取历史位置数据?

    过去 从 iPhone 上名为solidified db 的文件中获取历史位置数据很容易 例如 请参阅http petewarden github com iPhoneTracker http petewarden github com i
  • Android 中的处理程序到处理程序与 Messenger 到 Messenger 通信

    问题 使用起来是否 更好 更快且开销更少 Handler http developer android com reference android os Handler html与使用 Handler 通信相比信使 http develop
  • 如何使 UITableView 可重新排列?

    我正在尝试使我的 UITableView 可编辑 以便您可以移动单元格 现在 当我单击编辑按钮时 它只允许我删除 但不能重新排列 我有的方法有 Code BOOL tableView UITableView tableView canEdi
  • 无法禁用 CALayer>>removeFromSuperlayer 的动画

    我希望从其超级层中删除 CALayer 而无需设置动画 这里发生的事情是图层动画到一个位置 效果很好 但是当动画停止时 执行此代码 将图层返回到其开始位置 并淡出 大概然后从超级层中删除 如何阻止它动画 removeFromSuperlay
  • 使用unittest时如何知道每次测试花费的时间?

    Unittest 仅显示运行所有测试所花费的总时间 但不单独显示每个测试所花费的时间 使用unittest时如何添加每个测试的计时 我想 目前不可能 http bugs python org issue4080 http bugs pyth
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 线程数组?

    所以我在理解如何避免线程的顺序执行时遇到了问题 我试图创建一个线程数组并在单独的循环中执行 start 和 join 函数 这是我现在拥有的代码示例 private static int w static class wThreads im
  • iphone相当于android打开其他应用程序的意图

    是否有像 iphone 中可用的 android 意图功能 Android 使用意图从调用应用程序打开其他应用程序 以使用其他应用程序已实现的功能 我在某处读到 iphone 有 url 方案 但找不到更多信息 thanks 尝试查看以下答
  • C# 为所有对象订阅相同的事件处理程序是线程安全的吗

    我的项目中有一种情况 我连接到多个服务器并监听事件 每当从服务器接收到事件时 Handler 就应该将该事件添加到公共队列中进行处理 所有连接都应将接收到的事件添加到队列中 foreach var item in collection Co
  • java中的负载均衡线程池的种类

    我正在寻找一个负载平衡的线程池 到目前为止还没有成功 不确定负载平衡是否是正确的措辞 让我解释一下我试图实现的目标 第1部分 我有 Jobs 有 8 到 10 个单一任务 在 6 核 CPU 上 我让 8 个线程并行处理此任务 这似乎提供了
  • 公共领域还好吗?

    在你像我最初那样做出直觉反应之前 请阅读整个问题 我知道它们让你感觉很脏 我知道我们以前都被烧伤过 我知道这不是 好风格 但是公共场所可以吗 我正在开发一个相当大规模的工程应用程序 该应用程序创建并使用结构的内存模型 从高层建筑到桥梁再到棚
  • 无论线程如何,对象是否总是能看到其最新的内部状态?

    假设我有一个带有简单整数计数变量的可运行对象 每次可运行对象运行时该变量都会递增 该对象的一个 实例被提交以在计划的执行程序服务中定期运行 class Counter implements Runnable private int coun
  • 加速度计适用于 iphone/ipad 模拟器吗?

    据我所知 当我在 XCode 中使用 iPad 模拟器时 我的应用程序应该会触发加速计事件 但事实并非如此 我用谷歌搜索了一下 似乎加速度计没有在模拟器中实现 这是正确的吗 如果是这样 为什么他们会有 硬件 gt 摇动手势 菜单选项 我的代
  • 将 numpy 数组写入文本文件的速度

    我需要将一个非常 高 的两列数组写入文本文件 而且速度非常慢 我发现如果我将数组改造成更宽的数组 写入速度会快得多 例如 import time import numpy as np dataMat1 np random rand 1000
  • 使用标识符启动 iPhone 应用程序

    我正在尝试在我的应用程序中启动应用程序 例如 如果我按下 testApp1 中的按钮 它应该打开 testApp2 有没有办法用应用程序标识符来做到这一点 我听说过一种名为的未记录方法launchApplicationWithIdentif
  • 使用 Dirac 在 iPhone 中进行实时音高变化 [重复]

    这个问题在这里已经有答案了 可能的重复 iPhone 上的实时音调变换 https stackoverflow com questions 1100495 real time pitch shifting on the iphone 我已经
  • 如何在 iPhone 中使用 XMPPFramework 创建 MultiUserChatRoom

    我正在 iPhone 中使用 XMPPFramwwork 开发聊天应用程序 我成功完成了一对一聊天 现在我想在我的应用程序中开发多用户聊天 我尝试了以下代码 但未调用 XMPPRoomDelegate 的任何委托方法 我如何开始创建聊天室
  • 如何将nsmutable数组添加到sqlite数据库表中

    如何将nsmutablearray添加到sqlite数据库表中 有人可以帮我编码吗 您可以使用 for int i 0 i lt mutArray count i NSString string mutArray objectAtIndex
  • 移动物体而不实际接触物体

    我是 iPhone 开发的初学者 我一直在寻找这个问题的答案 但还没有找到任何东西 我想做的是允许用户移动对象而无需实际触摸该对象 他们可以触摸屏幕上的任何位置 并且当他们移动时 对象将从原来的位置向用户的方向移动移动但不会跳到他们的触摸位
  • 带有自定义字体的 UILabel 错误呈现

    在我的 iPhone 应用程序中 我为所有 UILabel 设置了自定义字体 更准确地说 我对 UILabel 进行了子类化 重写了一个方法 在该方法中设置了自定义字体 然后将 IB 中的所有标签设置为该自定义类 现在的问题是 所有文本都渲

随机推荐