objective-c ++ 的音频处理性能

Perfomance in audio processing with objective-c ++

我目前正在开发一个音频应用程序,性能是我主要关心的问题之一。

确实有Four common mistakes in audio development or Real-time audio programming 101: time waits for nothing.

这样的好文章

我知道 c++ 是音频处理的方式,但我仍然有一个问题:Objective-C++ 会降低性能吗?

例如使用这样的代码

@implementation MyObjectiveC++Class

- (float*) objCMethodWithOnlyC++:(float*) input {
    // Process in full c++ code here
}

@end

此代码的效率是否会低于 cpp 文件中的相同代码?

附加问题:如果我在此方法中使用 GrandCentralDispatch 以并行化进程,会发生什么情况?

调用 obj C 方法比调用纯 c 或 c++ 方法慢,因为每次调用都会调用 obj C 运行时。如果这对您的情况很重要,则取决于每次通话中处理的样本数量。如果您一次只处理一个样品,那么这可能是个问题。如果您处理一个大缓冲区,那么我不会太担心。

最好的办法是分析它,然后根据您的性能要求评估结果。

对于您的奖励问题,答案有些相同。 GCD 是有代价的,如果这个代价大于你通过并行化它所获得的,那么它就不值得了。所以这又取决于您计划在每次通话中完成的工作量。

问候 克劳斯

为简化起见,最终 ObjC 和 C++ 代码会经历与 C 相同的编译和优化链。因此,ObjC 或 C++ 方法中相同代码的性能特征是相同的。

也就是说,调用 ObjC 或 C++ 方法具有不同的性能特征。 ObjC 提供了一个动态可修改的、二进制稳定的 ABI 及其方法。这些额外的保证(如果您通过 public API 从例如框架公开方法,这是很好的)会带来轻微的性能成本。

如果您对同一个方法进行多次调用(例如每个样本或每个像素),那么微小的性能损失可能会累积起来。这同样适用于 ivar 访问,它在 C++(在现代运行时)中如何进行 ivar 访问以保证二进制稳定性。

类似的注意事项适用于 GCD。 GCD 并行化操作,因此您需要为线程切换(与常规线程一样)和您分派的每个新块付出代价。但它们中的实际代码运行速度与在其他任何地方的运行速度相同。此外,与启动您自己的线程不同,GCD 将重新使用池中的线程,因此您无需为重复创建新线程支付开销。

这是一个权衡。根据您的代码做什么、它是如何做的以及单个操作需要多长时间,这两种方法都可能更快。您只需要配置文件并查看即可。

你可能做的最糟糕的事情是在一个实时 CoreAudio 线程中做一些不需要实时的事情(比如更新你的音量计),或者调用那个块。

PS - 在大多数情况下,性能差异可以忽略不计。因此,另一个需要关注的方面是代码的可读性和易维护性。例如。使用块可以使具有大量异步性的代码更易于阅读,因为您可以在源文件的一种方法中以正确的顺序设置块,这比将它们拆分成几个只做一小部分的方法更清晰东西,然后启动一个异步进程。