配置文件构建vs普通构建:CPU使用情况



简写:

在TL;DR部分之前,我的主要问题是,当使用工具构建配置文件时,与常规构建有什么区别,这将导致我的应用程序的CPU负载减少200%以上?

当构建运行时,根据活动监视器的报告,它使用了超过200%的CPU,但是在其他一切都相同的情况下,当构建分析时,使用时间分析器,它将CPU负载降低到5%,这是一个显着的(数量级)差异。

TL;博士版:

作为学习Cocoa, Swift和DSP的练习(是的,同时学习三个),我正在使用便宜的rtl-sdr加密狗编写一个简单的无线电扫描仪OS X应用程序。

我已经写了一个简单的Swift包装围绕librtlsdr,一个简单的UI,能够设置频率,和几个简单的DSP例程。我围绕librtlsdr的包装使用NSOperationQueue,我的DSP例程使用GCD队列,以便将IO和CPU密集型例程移出主线程/队列。

目前,一切都在工作,我可以成功地解调AM传输。

我已经实现了一个简单的低通FIR滤波器,而在研究算法时,当我意识到我不能使用超过30个系数之前,我的滤波器程序开始花费太长时间,音频变得断断续续时,我感到很惊讶。此外,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上的任何压力之前找出我可以强调的程度,在它开始明显波动之前,我已经达到了50,000个水龙头过滤器,CPU使用率接近300%。综上所述,正常的构建和运行,我最多使用35-40个过滤器;配置文件的构建和运行,我在大约50,000个过滤器水龙头的最大值。

同样值得注意的是,虽然配置了50,000个过滤器,但UI仍然可以立即响应,我可以改变频率,启动/停止收音机,它有不稳定的音频。在正常运行期间,当我启动没有音频的收音机时,UI就开始冻结,这发生在我只有大约50次点击之后。

再次说明,为什么在运行时分析和只运行标准构建之间的CPU使用差异如此之大;除了提升了Instruments的权限之外,还有什么不同之处?我需要做些什么才能使其成为我的应用程序的正常行为?

这都是关于构建配置的。当你用Xcode分析一个应用程序时,它会被优化构建,因为Xcode使用"发布"构建配置进行分析。顾名思义,"发布"配置也用于您的最终产品,因此总是为速度优化的构建。当您通过按⌘R在Xcode中构建应用程序时,默认的"调试"构建配置不会应用任何编译器优化。这就是为什么你的应用程序在没有被分析的情况下会变慢的原因。

您可以在这里了解有关构建配置的更多信息:https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/BasingBuildConfigurationsonConfigurationFiles.html#//apple_ref/doc/uid/TP40010155-CH13-SW1

最新更新