Cocoa 移植到Objective-C的Java代码非常慢

Cocoa 移植到Objective-C的Java代码非常慢,cocoa,Cocoa,我想举例说明一个具体的例子,以了解在Objective-C中重写java代码时是否存在最佳(和最差)实践 我已经将的Java实现移植到OSX Snow Leopard(Xcode 4)上的Objective-C,但是与Java版本相比,结果运行得非常慢 性能最差的方法是buildPath,它主要是 稀疏数组访问(对角变量,此数组在方法内部分配,不返回) 随机数组访问(orig和rev变量) PathNode及其子类的分配(具有三个属性的对象,唯一属性是数组内部使用的元素) 字符串比较 Coc

我想举例说明一个具体的例子,以了解在Objective-C中重写java代码时是否存在最佳(和最差)实践

我已经将的Java实现移植到OSX Snow Leopard(Xcode 4)上的Objective-C,但是与Java版本相比,结果运行得非常慢

性能最差的方法是buildPath,它主要是

  • 稀疏数组访问(对角变量,此数组在方法内部分配,不返回)
  • 随机数组访问(orig和rev变量)
  • PathNode及其子类的分配(具有三个属性的对象,唯一属性是数组内部使用的元素)
  • 字符串比较
Cocoa没有任何集合类可以轻松处理稀疏数组,因此我使用malloc分配了一个数组,这大大改进了基于NSDictionary的第一个版本,并将NSNumber的大量对象分配为密钥

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的程序。它缺少一个图书馆,它需要这样做。