1

如果我做:

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;

还是它们等效?

4

3 回答 3

2

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

即使没有,您也将难以衡量差异(除非foosC++ 类具有极其昂贵的operator[]. 除非分析器另有说明——优化此代码还为时过早。

于 2012-08-25T09:21:06.473 回答
1

如果您的数组是一个简单的 C 数组 ( Foo * array[11];),那么它不会对性能产生重大影响。

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


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

MRC:

NSArray:27 秒

C 数组:18 秒

弧:

NSArray:31 秒

C 数组:18 秒

和程序(您可以执行明显的 ARC 更改来测试 ARC):

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;
}
于 2012-08-25T09:35:18.550 回答
0

当然,除非编译器将其优化掉。效率是否显着降低是另一回事,这取决于您的代码还在做什么。担心这样的微优化通常是徒劳的,除非您已经有证据表明附近存在效率问题。

于 2012-08-25T11:44:30.477 回答