是否可以从课外使用直接的ivar访问以提高效率?

Mic*_*nen 2 performance class objective-c ivar

我可以定义一个具有属性的类来从类外部访问我的ivars.

我也可以使用myInst-> ivar语法以C-struct方式访问.

在C++中,我会使用访问器,但在objective-c中,有些情况下我可能需要直接访问.消息传递系统在某些上下文中对访问器造成了很大的性能损失,因为消息不像C++方法那样内联.

例如,在具有称为标量的ivar和在其上定义的属性的类中.标量是一个简单的浮点值:

-(void) doWorkWithMyClass:(MyClass*)myinst
{
   // array and other locals declaration omitted 
   for (int i = 0; i < reallyBigX; i++) {
      result += [myinst scalar] * array[i];
      [myinst computeNextScalar:i];
   }
}
Run Code Online (Sandbox Code Playgroud)

如果我将[myinst标量]更改为myinst->标量,则该方法将运行得更快,因为使用带有访问器的调用将占用此循环中的大部分CPU.

与C++一样,我理解直接的ivar访问通常是不鼓励的,但在这种情况下,当速度很重要时,它是否可以接受?如果没有,是否有更优选的方法仍使用objective-c类?

Rob*_*ier 6

当它对性能产生重大影响时,很多事情都会被接受,但在你给出的例子中,似乎有更好的解决方案.

首先,为什么不[myinst computeNextScalar:i]返回新的标量?如果你这样做,你就不需要获取它,一切都会快得多.

工作不能搬进去myinst吗?我的意思是,你不能创造像:

result = [myinst totalOverArray:array];
Run Code Online (Sandbox Code Playgroud)

如果reallyBigX真的很大,那么你应该考虑Accelerate.framework.它可以显着提高您似乎正在进行的操作的性能.(您必须使用Accelerate框架进行性能测试.对于某些操作来说,它可能会慢得多,但这个操作可能会更快.)

最后,考虑Objective-C get...模式.它看起来像这样:

int *scalars = calloc(reallyBigX, sizeof(int));
[myinst getScalars:scalars range:NSMakeRange(0, reallyBigX)];
for (int i = 0; i < reallyBigX; i++) {
   result += scalars[i] * array[i];
}
free(scalars);
Run Code Online (Sandbox Code Playgroud)

顺便说一下,上面绝对是候选人vDSP_dotpr(),尽管你应该对它进行性能测试.在许多情况下,vDSP当stride = 1时,简单循环比等效调用更快(因为你可以使用简单的增量而不是+= stride).