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类?
当它对性能产生重大影响时,很多事情都会被接受,但在你给出的例子中,似乎有更好的解决方案.
首先,为什么不[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).