【发布时间】:2015-12-21 17:01:50
【问题描述】:
短版:
在 TL;DR 部分之前,我的主要问题是,使用 Instruments 构建配置文件和常规构建会导致我的应用程序的 CPU 负载减少 200% 以上有什么区别?
在构建运行时,它使用超过 200% 的 CPU,如活动监视器报告的那样,但在其他一切相同的情况下,在构建用于分析时,使用 Time Profiler,它将 CPU 负载降低到
TL;DR 版本:
作为学习 Cocoa、Swift 和 DSP(同时是三个)的练习,我正在使用便宜的 rtl-sdr 加密狗编写一个简单的无线电扫描器 OS X 应用程序。
我围绕 librtlsdr 编写了一个简单的 Swift 包装器,一个能够设置频率的简单 UI,以及几个简单的 DSP 例程。我的 librtlsdr 包装器使用 NSOperationQueue,而我的 DSP 例程使用 GCD 队列,以便将 IO 和 CPU 密集型例程移出主线程/队列。
目前,一切正常,可以成功解调 AM 传输。
我已经实现了一个简单的低通 FIR 滤波器,并且在研究算法时,当我意识到在我的滤波器例程开始花费太长时间并且音频变为断断续续。同样,Activity Monitor 显示我的应用程序的 CPU 使用率高达 300%,考虑到我的过滤器只包含一个嵌套循环来执行一些乘法和累加操作,这似乎非常高。任何高于大约 40 的系数,UI 都会变得无响应。
对于 DSP 而言,它是一个抽取滤波器,我使用整个样本集进行滤波 (960000 sps),但只过滤我需要降低速率的样本 (48000),使用矩形窗口 sinc 函数系数,预先计算。不是最有效的算法,但在我的四核 i7 Macbook Pro 和 iMac 上,它应该仍然会尖叫。
为了深入了解我的程序在哪里耗尽了所有 CPU 周期,我决定试一试 Instruments。 Product->Profile,选择 Time Profiler 并运行我的应用程序给了我一些有趣的信息。
1) 我的过滤例程没有使用最多的 CPU 周期。
2) 活动监视器显示我的应用甚至没有达到 5% 的 CPU 使用率
因此,我决定在看到 CPU 受到任何压力之前找出我能承受多大的压力,并且在它开始出现明显波动并且 CPU 使用率接近 300% 之前,我达到了 50,000 个抽头滤波器。所以……回顾一下,正常构建和运行,我最多可以使用大约 35-40 个过滤器抽头;配置文件构建并运行,我最多可以使用大约 50,000 个过滤器抽头。
另外值得注意的是,在使用 50,000 个过滤器抽头进行分析时,UI 仍然会立即响应,我可以更改频率、启动/停止收音机,并且它的音频断断续续。在正常运行期间,当我在没有音频的情况下启动收音机时,UI 就开始冻结,并且在我只有大约 50 次点击后才会发生这种情况。
再次,为什么在分析时运行与仅运行标准构建之间的 CPU 使用率存在巨大差异?除了提升 Instruments 的权限外,还有什么不同?我需要做什么才能使其成为我的应用的正常行为?
JE
【问题讨论】:
标签: xcode cocoa profiling instruments