我正在编写一个 Objective-C 游戏,我正处于应该开始优化游戏循环中的一些代码的阶段。
我使用了大量的类比较方法,
if ([obj isMemberOfClass:[SomeClass class]])
等等
我听说这种检查非常昂贵,因为我选择只让 1 个数组填充多个类,我需要某种类检查。
我在想,也许向 NSObject 子类化 NSObject 添加一个属性以包含一个字符串属性,在初始化期间我将等于该特定子类的类名。然后简单地做一个
if ([obj.klass isEqualTo:@"SomeClass"])
这会有好处吗?
我试图尽可能多地将动态编码排除在游戏循环之外。
谢谢!
最佳答案
简短的回答:没有。与其他比较(或:分类、分类)对象的方法相比,字符串比较的成本高得令人望而却步。
长答案:不要优化你没有分析、测量和比较的东西。在开始优化之前,您真正想要做的是清楚地了解您的应用程序的行为方式及其性能瓶颈。您正在尝试的更改不太可能导致任何明显的性能变化,因此我建议首先找到真正的瓶颈。
在这种特殊情况下,如果测试失败,发送 isEqual 到 NSString 比 isMemberOfClass 慢 4 倍。而这种条件测试大多数时候都失败了,这就是为什么你应该忽略测试成功的结果。
成功的字符串比较很快,因为它是一个简单的指针比较,如果两个字符串相等,很可能它们指向相同的内存地址。如果它们不相等,则将比较字符串中的每个字符是否相等,可能使用散列方法。
这是我添加到我的 performance test project 中的对象比较测试的结果。 .您可以使用该项目进行进一步的测试。
关于iphone - Objective-C 中的字符串比较与类比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8250828/