由于objc_msgSend,IOS代码变得非常慢

时间:2013-09-16 21:17:21

标签: c++ ios objective-c c arrays

我已经将部分代码从非常简单的c数组重写为使用(或尝试使用)对象,以便获得更多结构。我没有通过函数头传递数组,而是使用由单例定义的全局数组。您可以在我的代码中看到一个函数示例:

它是:

void calcdiv(int nx,int ny,float **u,float **v,
float **divu,float dx,float dy,float **p,
float dt,float rho, float **bp,float **lapp)
{

int i,j;

for (i=2;i<=nx-3;++i){
    for (j=2;j<=ny-3;++j){
        divu[i][j] = (u[i+1][j]-u[i-1][j])*facu +
                     (v[i][j+1]-v[i][j-1])*facv;
    }
}
...

现在是:

void calcdiv()
{

int i,j;

SingletonClass* gV = [SingletonClass sharedInstance];

for (i=2;i<=gV.nx-3;++i){
    for (j=2;j<=gV.ny-3;++j){
        gV.divu[i][j] = (gV.u[i+1][j]-gV.u[i-1][j])*facu +
                        (gV.v[i][j+1]-gV.v[i][j-1])*facv;
    }
}
...

在重组之前,我一直在使用上面给出的函数调用。这意味着直接将指针传递给数组。现在我通过单例调用“SingletonClass * gV ...”访问数组。它的工作非常精细,除了它比以前慢得多。分析器告诉我,我的程序花了41%的时间用objc_msgSend,这是我之前没有的。

从阅读帖子我已经明白,当经常调用msgSend时可能会发生这种情况。这很可能就是这种情况,因为我的程序需要大量的数字运算来显示OpenGl的动画流。

这引出了我的问题:你会建议什么?我应该继续使用简单的C实现还是有一种相当简单的方法来加速目标c版本?因为我不熟悉客观的c编程,所以请耐心等待。

非常感谢任何提示和建议!提前谢谢。

1 个答案:

答案 0 :(得分:3)

如果您的直接C方法工作正常,并且您的Objective C方法因为方法调用而使您处于劣势,并且您需要性能,那么没有理由不直接使用C.从查看您的代码,我不知道看到你添加的任何“结构”都没有任何优势,因为工作代码几乎完全相同。换句话说,Obj-C不会在这里给你买任何东西,但是直接用C,所以请选择最适合你用户的东西,因为在可维护性和可读性方面,这两种实现没有区别。