配置文件构建与正常构建:CPU 用法?
Profile Build vs Normal Build: CPU Usage?
简短版本:
在 TL;DR 部分之前,我的主要问题是,使用仪器进行分析与常规构建有什么区别,这会导致 CPU 我的应用程序负载减少 200% 以上?
构建到 运行 时,它使用了 activity 监视器报告的超过 200% CPU,但其他一切都一样,构建分析时,使用 Time Profiler,它将 CPU 负载降低到 <5%,这是一个显着的(数量级)差异。
TL;DR 版本:
作为学习 Cocoa、Swift 和 DSP(是的,同时学习这三个)的练习,我正在编写一个简单的无线电扫描器 OS X 应用程序,使用便宜的rtl-sdr 加密狗。
我已经围绕 librtlsdr 编写了一个简单的 Swift 包装器、一个能够设置频率的简单 UI 以及几个简单的 DSP 例程。我的 librtlsdr 包装器使用 NSOperationQueue,我的 DSP 例程使用 GCD 队列,以便将 IO 和 CPU 密集例程从主线程/队列中移出。
目前,一切正常,我可以成功解调 AM 传输。
我已经实现了一个简单的低通 FIR 滤波器,并且在研究该算法时,当我意识到在我的滤波器例程开始花费太长时间之前我不能使用超过大约 30 个系数并且音频变得不稳定。同样,Activity Monitor 显示我的应用程序使用率高达 300% CPU,考虑到我的过滤器只包含一个嵌套循环来执行一些乘法和累加操作,这似乎高得离谱。任何高于约 40 个系数并且 UI 变得无响应。
对于 DSP 而言,它是一个抽取滤波器,我使用整个样本集进行过滤 (960000 sps),但仅过滤我需要的样本以降低速率 (48000),使用矩形窗口 sinc系数的函数,预先计算。不是最有效的算法,但在我的四核 i7 Macbook Pro 和 iMac 上,它应该仍然尖叫。
为了深入了解我的程序在哪里用完了所有 CPU 周期,我决定试一试 Instruments。 Product->Profile,选择 Time Profiler 和 运行ning 我的应用程序给了我一些有趣的信息。
1) 我的过滤程序没有使用最多 CPU 个周期。
2) Activity 监视器显示我的应用甚至没有达到 5% CPU 使用率
所以我决定找出在我看到 CPU 上有任何压力之前我可以对事物施加压力的程度,并且在它开始明显起伏不定和 CPU 使用率接近 300%。所以……回顾一下,正常构建和 运行,我最多使用大约 35-40 个滤波器抽头;配置文件构建和 运行,我最多使用大约 50,000 个过滤器抽头。
同样值得注意的是,在使用 50,000 个滤波器抽头进行分析时,UI 仍然会立即响应,我可以更改频率、启动/停止收音机,但它的音频断断续续。在正常的 运行 期间,UI 在我打开没有音频的收音机后立即开始冻结,这发生在我只有大约 50 个水龙头之后。
同样,为什么 运行ning 在分析时和 运行ning 只是一个标准构建之间 CPU 用法有显着差异;除了 Instruments 的提升权限之外有什么不同?我需要做什么才能使其成为我应用程序的正常行为?
JE
这都是关于构建配置的。当您使用 Xcode 分析应用程序时,它会通过优化构建,因为 Xcode 使用 "release" 构建配置进行分析。顾名思义,"release" 配置也用于您的最终产品,因此始终是针对速度优化的构建。默认 "debug" 构建配置会在您通过按 ⌘R 在 Xcode 中构建应用程序时发挥作用,不会应用任何编译器优化。这就是为什么您的应用在未被分析时变慢的原因。
您可以在此处了解有关构建配置的更多信息:https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/BasingBuildConfigurationsonConfigurationFiles.html#//apple_ref/doc/uid/TP40010155-CH13-SW1
简短版本:
在 TL;DR 部分之前,我的主要问题是,使用仪器进行分析与常规构建有什么区别,这会导致 CPU 我的应用程序负载减少 200% 以上?
构建到 运行 时,它使用了 activity 监视器报告的超过 200% CPU,但其他一切都一样,构建分析时,使用 Time Profiler,它将 CPU 负载降低到 <5%,这是一个显着的(数量级)差异。
TL;DR 版本:
作为学习 Cocoa、Swift 和 DSP(是的,同时学习这三个)的练习,我正在编写一个简单的无线电扫描器 OS X 应用程序,使用便宜的rtl-sdr 加密狗。
我已经围绕 librtlsdr 编写了一个简单的 Swift 包装器、一个能够设置频率的简单 UI 以及几个简单的 DSP 例程。我的 librtlsdr 包装器使用 NSOperationQueue,我的 DSP 例程使用 GCD 队列,以便将 IO 和 CPU 密集例程从主线程/队列中移出。
目前,一切正常,我可以成功解调 AM 传输。
我已经实现了一个简单的低通 FIR 滤波器,并且在研究该算法时,当我意识到在我的滤波器例程开始花费太长时间之前我不能使用超过大约 30 个系数并且音频变得不稳定。同样,Activity Monitor 显示我的应用程序使用率高达 300% CPU,考虑到我的过滤器只包含一个嵌套循环来执行一些乘法和累加操作,这似乎高得离谱。任何高于约 40 个系数并且 UI 变得无响应。
对于 DSP 而言,它是一个抽取滤波器,我使用整个样本集进行过滤 (960000 sps),但仅过滤我需要的样本以降低速率 (48000),使用矩形窗口 sinc系数的函数,预先计算。不是最有效的算法,但在我的四核 i7 Macbook Pro 和 iMac 上,它应该仍然尖叫。
为了深入了解我的程序在哪里用完了所有 CPU 周期,我决定试一试 Instruments。 Product->Profile,选择 Time Profiler 和 运行ning 我的应用程序给了我一些有趣的信息。
1) 我的过滤程序没有使用最多 CPU 个周期。
2) Activity 监视器显示我的应用甚至没有达到 5% CPU 使用率
所以我决定找出在我看到 CPU 上有任何压力之前我可以对事物施加压力的程度,并且在它开始明显起伏不定和 CPU 使用率接近 300%。所以……回顾一下,正常构建和 运行,我最多使用大约 35-40 个滤波器抽头;配置文件构建和 运行,我最多使用大约 50,000 个过滤器抽头。
同样值得注意的是,在使用 50,000 个滤波器抽头进行分析时,UI 仍然会立即响应,我可以更改频率、启动/停止收音机,但它的音频断断续续。在正常的 运行 期间,UI 在我打开没有音频的收音机后立即开始冻结,这发生在我只有大约 50 个水龙头之后。
同样,为什么 运行ning 在分析时和 运行ning 只是一个标准构建之间 CPU 用法有显着差异;除了 Instruments 的提升权限之外有什么不同?我需要做什么才能使其成为我应用程序的正常行为?
JE
这都是关于构建配置的。当您使用 Xcode 分析应用程序时,它会通过优化构建,因为 Xcode 使用 "release" 构建配置进行分析。顾名思义,"release" 配置也用于您的最终产品,因此始终是针对速度优化的构建。默认 "debug" 构建配置会在您通过按 ⌘R 在 Xcode 中构建应用程序时发挥作用,不会应用任何编译器优化。这就是为什么您的应用在未被分析时变慢的原因。
您可以在此处了解有关构建配置的更多信息:https://developer.apple.com/library/mac/recipes/xcode_help-project_editor/Articles/BasingBuildConfigurationsonConfigurationFiles.html#//apple_ref/doc/uid/TP40010155-CH13-SW1