Objective c 多次引用实例变量数组元素是否比引用局部变量效率低?

Objective c 多次引用实例变量数组元素是否比引用局部变量效率低?,objective-c,arrays,performance,variables,instance-variables,Objective C,Arrays,Performance,Variables,Instance Variables,如果我这样做: foos[i] = [[Foo alloc] init]; foos[i].prop = @"bar"; [foos[i] baz]; 。。。这是否比: Foo *foo = [[Foo alloc] init]; foo.prop = @"bar"; [foo baz]; foos[i] = foo; 或者它们是等价的?它们不是等价的,但是它们非常接近,优化编译器可能会生成完全相同的二进制代码 即使不这样,也会很难度量差异(除非 FoS是一个C++类,它的代码非常昂贵,运算

如果我这样做:

foos[i] = [[Foo alloc] init];
foos[i].prop = @"bar";
[foos[i] baz];
。。。这是否比:

Foo *foo = [[Foo alloc] init];
foo.prop = @"bar";
[foo baz];
foos[i] = foo;

或者它们是等价的?

它们不是等价的,但是它们非常接近,优化编译器可能会生成完全相同的二进制代码


即使不这样,也会很难度量差异(除非<代码> FoS是一个C++类,它的代码非常昂贵,<代码>运算符[]/COD>)。除非探查器另有说明—优化此代码为时过早。

如果您的数组是简单的a C数组(
Foo*array[11];
),则它不会对性能产生显著影响

如果您的数组是一个
NSMutableArray
(或另一个可下标的NS类型),那么它将不得不重复调用方法的实现(使用短路分派),因此将引入一些开销。虽然有些人会认为这是一个微观优化。在这种情况下,编译器不能知道实现返回的内容,因此不能忽略调用


以下是基本的挂钟时间结果:

MRC:

纳雷:27秒

C阵列:18秒

弧:

纳雷:31秒

C阵列:18秒

以及程序(您可以对其执行明显的圆弧更改以测试圆弧):

const int NIter=10000;
__属性(noinline))void fn1(){
@自动释放池{
NSMutableArray*foos=[NSMutableArray];
对于(大小\u t idx=0;idx
当然可以,除非编译器对其进行优化。效率是否明显降低是另一个问题,这取决于您的代码正在做什么。担心像这样的mico优化通常是徒劳的,除非您已经有证据表明这附近存在效率问题

const int NIter = 10000;

__attribute__((noinline)) void fn1() {
  @autoreleasepool {
    NSMutableArray * foos = [NSMutableArray array];
    for (size_t idx = 0; idx < NIter; ++idx) {
      NSMutableString * str = [NSMutableString new];
      foos[0] = str;
      [foos[0] length];
      [foos removeAllObjects];
      [str release];
    }
  }
}

__attribute__((noinline)) void fn2() {
  @autoreleasepool {
    NSMutableString * foos[1];
    for (size_t idx = 0; idx < NIter; ++idx) {
      foos[0] = [NSMutableString new];
      [foos[0] length];
      [foos[0] release];
      foos[0] = 0;
    }
  }
}

int main() {
  for (size_t idx = 0; idx < NIter; ++idx) {
    if (UseNSArray) {
      fn1();
    }
    else {
      fn2();
    }
  }
  return 0;
}