简短版本:
在TL; DR部分之前,我的主要问题是,使用工具构建配置文件然后定期构建会导致我的应用程序的CPU负载减少200%以上会有什么不同?
在构建运行时,它使用活动监视器报告的超过200%的CPU,但是在其他所有内容相同的情况下,使用Time Profiler构建分析时,它会将CPU负载降低到<5%,这是一个戏剧性的(数量级)差异。
TL; DR版本:
作为学习Cocoa,Swift和DSP的练习(同时是三个),我正在使用便宜的rtl-sdr加密狗编写一个简单的无线电扫描器OS X应用程序。
我在librtlsdr周围编写了一个简单的Swift包装器,一个能够设置频率的简单UI,以及一些简单的DSP例程。我的librtlsdr包装器使用NSOperationQueue,我的DSP例程使用GCD队列,以便将IO和CPU密集例程从主线程/队列中移出。
目前,一切正常,我可以成功解调AM传输。
我已经实现了一个简单的低通FIR滤波器,在处理算法时,当我意识到在我的滤波器例程开始耗时太长并且音频变为音频之前我不能使用大约30个系数时,我感到很惊讶断断续续。同样,Activity Monitor显示我的应用程序的CPU使用率高达300%,考虑到我的过滤器只包含嵌套循环以进行一些乘法和累积操作,这看起来很疯狂。任何高于约40个系数的东西都会变得无法响应。
对于DSP专注,它是一个抽取滤波器,我使用整个样本集进行滤波(960000 sps),但只过滤我需要的速率降低样本(48000),使用矩形窗口sinc函数系数,预先计算。不是最有效的算法,但在我的四核i7 Macbook Pro和iMac上,它应该仍然会尖叫。
为了深入了解我的程序耗尽了所有CPU周期,我决定让仪器继续使用。 Product-&gt; Profile,选择Time Profiler并运行我的应用程序给了我一些有趣的信息。
1)我的过滤程序没有使用最多的CPU周期 2)活动监视器显示我的应用程序甚至没有达到5%的CPU使用率
所以我决定在看到CPU上的任何压力之前找出能够给压力做多远的事情,并且在它开始明显不稳定且CPU使用率接近300%之前,我达到了50,000过滤器。所以...回顾一下,正常构建和运行,我最多可以达到35-40个滤波器;配置文件构建和运行,我最多可以使用大约50,000个过滤器。
另外值得注意的是,在使用50,000个过滤器分析器进行分析时,UI仍然可以立即响应,我可以更改频率,启动/停止收音机,并且它具有不稳定的音频。在正常运行期间,只要我在没有音频的情况下启动收音机,UI就会开始冻结,这种情况发生在我只有大约50次点击之后。
同样,为什么在分析运行和运行标准构建之间的CPU使用率之间存在巨大差异;除了提升乐器的特权之外还有什么不同之处,我需要做些什么才能使其成为我应用的正常行为?
JE
答案 0 :(得分:0)
这就是构建配置。当您使用Xcode分析应用程序时,它会通过优化构建,因为Xcode使用&#34;发布&#34;构建用于分析的配置。顾名思义,&#34;发布&#34; config也用于您的最终产品,因此始终是针对速度优化的构建。默认&#34;调试&#34;通过按⌘R在Xcode中构建应用程序时构建的配置不会应用任何编译器优化。这就是为什么你的应用程序在没有被分析时会变慢的原因。