c++ - IOS代码因为objc_msgSend变得很慢

标签 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 实现还是有一种相当简单的方法来加速 objective-c 版本?请耐心等待我,因为我是 Objective C 编程的新手。

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

最佳答案

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

关于c++ - IOS代码因为objc_msgSend变得很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18837479/

相关文章:

c++ - libstatgrab 的问题

c++ - 将结构类型与函数一起使用

ios - 如何在控件上方添加动态大小 View ?

ios - 如何使用终端使用 xCode 命令行工具?

ios - UISwitch 值更改操作 : unrecognized selector sent to class

ios - 创建一个不断扩大的圈子 iOS

C++11 标准与 CUDA 6.0

C++ 内存泄漏检查

iphone - Objective-C 2.0 : class_copyPropertyList(), 如何从类别中列出属性

iphone - 有没有办法从NSDictionary自动构造对象?