gpt4 book ai didi

objective-c - Objective-C 运行时性能惩罚的细节

转载 作者:太空狗 更新时间:2023-10-30 04:00:36 28 4
gpt4 key购买 nike

我一直在尝试使用 Objective-C(特别是 GNU 运行时,我没有使用 GNUStep 或类似的东西)用对象扩展 C。到目前为止它进展顺利 - 它运行良好并且我真的很喜欢语法,但是根据我一直在阅读的内容,使用 Objective-C 对象会降低性能。

我通常不会过早优化,但我正在开发一款游戏,因此性能最终会变得相当关键 - 我想知道我正在做些什么!一些人建议我在游戏中使用 Objective-C 就可以了,只要我的最内层循环是用标准 C 编写的,但问题是找到我应该进行切换的点。

所以我的问题是双重的:

  • 究竟什么会导致性能下降? (所以我知道我应该避免什么)
  • 大致这种性能损失有多严重? (所以我可以提前猜测我的游戏的哪些部分无论如何都需要用 C 编写)

我的猜测是在 Objective-C 对象上调用方法会招致惩罚,但我不确定还有什么 - 取消引用 Objective-C 对象会招致类似的惩罚吗?

int a = myobj->a;

使用 try-catch-finally 怎么样 - 在没有抛出异常的情况下这会导致性能下降吗?

我意识到在某种程度上我可以使用基准测试自己解决大部分问题,但我对此比较陌生,我希望能更深入地了解 Objective-C 的工作原理以及任何性能损失的性质.

目前我对 C++ 不感兴趣,我只是在试验 Objective-C。

最佳答案

So my question is twofold:

What exactly will incur a performance penalty? (so I know what I should avoid)

Roughly how significant is this performance penalty? (so I can guestimate in advance which bits of my game will need to be written in C anyway)

(我的基础来自苹果的实现:)

在大多数情况下,最大的惩罚是每个实例方法(消息传递)都是动态调用

此调用/消息的成本大约是 C++ 虚拟调用的 4 倍。

这些调用可能不会被优化掉(除非有人对 JIT/HotSpot 进行了很好的实现),并且与 c 或 c++ 不同,这些方法可能不会被内联。

但不仅仅是消息传递:

您的对象将被引用计数分配。这意味着:大量锁定和许多单独的小分配,以及用于引用计数的原子。

objc_msgSend 和变体(运行时消息传递实现的主要内容)可能会占用大约 10% 的执行时间(极端现实情况)。

它也可以增加二进制文件的大小。

惯用的用法在许多领域使它比 c++ 或 c 的速度更进一步。 (例如,考虑如何传递/处理数字)。

花费多少取决于方法的大小。好的 ood 意味着您的方法通常很短。您要么以大量消息和明显的重量(如果要获得高性能)结束,要么妥协您的设计。

还有一些其他问题,例如在实时应用程序中。

int a = myobj->a;

与c相比没有区别

...exceptions...

(iirc) apple 以前的异常模型过去使用昂贵的设置,现在它们沿着 c++ 的零成本异常的路线(优化异常不会被定期抛出,并且在入口/设置上边际,但抛出/捕获昂贵).

如果性能真的很重要,我会避免它而只使用 C++。它有很多功能和速度。您需要做一些工作才能获得 objc 的一些便利——其中大部分在于可用的库,而不是语言。

关于objective-c - Objective-C 运行时性能惩罚的细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5737887/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com