Cocoa 移植到Objective-C的Java代码非常慢
我想举例说明一个具体的例子,以了解在Objective-C中重写java代码时是否存在最佳(和最差)实践 我已经将的Java实现移植到OSX Snow Leopard(Xcode 4)上的Objective-C,但是与Java版本相比,结果运行得非常慢 性能最差的方法是buildPath,它主要是Cocoa 移植到Objective-C的Java代码非常慢,cocoa,Cocoa,我想举例说明一个具体的例子,以了解在Objective-C中重写java代码时是否存在最佳(和最差)实践 我已经将的Java实现移植到OSX Snow Leopard(Xcode 4)上的Objective-C,但是与Java版本相比,结果运行得非常慢 性能最差的方法是buildPath,它主要是 稀疏数组访问(对角变量,此数组在方法内部分配,不返回) 随机数组访问(orig和rev变量) PathNode及其子类的分配(具有三个属性的对象,唯一属性是数组内部使用的元素) 字符串比较 Coc
- 稀疏数组访问(对角变量,此数组在方法内部分配,不返回)
- 随机数组访问(orig和rev变量)
- PathNode及其子类的分配(具有三个属性的对象,唯一属性是数组内部使用的元素)
- 字符串比较
[[MyClass alloc]init]
完成的,它们不会自动删除,因为它们被添加到NSMutableArray(但在添加到array后会立即释放)
对数组的随机访问是使用[NSArray objectAtIndex:index]完成的,我认为(但我可能错了)将其移动到类C并不会有太大的加速
您是否有改进性能的想法,在哪里可以找到瓶颈?
使用仪器74%的时间用于分配,我如何改进分配
编辑我已将实际实现提交给,显然是一个alpha版本,尚未准备好生产,并且没有使用任何有效的objective-c构造您可以使用该类替换稀疏数组nspointerray
允许null
元素
如果您发布生成大部分分配的代码,我们可能会为您提供更多帮助。您已经有了一个很好的开始。您已经分析了代码,隔离了实际的瓶颈,现在重点关注如何解决它 第一个问题是哪种分配成本高?显然,你应该先关注这一点 有几种有效的方法来处理稀疏数组。首先,看看,它被设计用来保存空值。它不能保证对稀疏数组有效,但是@bbum(谁知道这样的事情) 接下来,看一看,它对于稀疏集合(它是一个字典)肯定是有效的,并且支持非对象键(即,您不需要创建
NSNumber
)
最后,如果分配真的是你的问题,有各种各样的技巧来解决它。最常见的是重用对象,而不是破坏一个对象并创建另一个对象。这就是UITableViewCell
的工作方式(以及NSCell
的不同工作方式)
最后,如果您切换到核心基础对象,您可以创建自己的专用内存分配器,但这确实是最后一个选择。
请注意,10.6支持ARC(无需调零弱参考)。ARC围绕许多常见的内存管理模式显著提高了性能。例如,非常常见的“保留+自动释放+返回”模式在ARC下得到了高度优化。(“retain”在ARC中的语言中不存在,但它仍然存在于编译器中,而且ARC比手工操作快得多。)我强烈建议在任何代码中切换到ARC。尝试使用“堆栈对象”正如本文所解释的:它们非常有限,但是如果您需要buildPath例程中的数据,只有这样才能帮助减少分配时间。感谢“stack objects”帮助我删除malloc/free,但主代码依赖(并返回)包含它们的数组的对象在循环中分配。我已经改进了我的问题我已经在github上提交并更新了我的问题具有性能瓶颈的类是我正在使用雪豹,但XCode 4 for SL不支持ARC@dafi对雪豹可以运行在Lion上构建的使用ARC的程序,但雪豹上的Xcode无法构建使用ARC的程序。它缺少一个图书馆,它需要这样做。