繁体   English   中英

运行时属性和实际属性之间的性能差异是什么?

[英]What's the performance difference between runtime property and real properties?

如果我编写具有一些动态属性的类别而不是说子类化,那么对性能而言真的有意义吗?

(让我们保持专注并坚持表现,而不是本文的设计模式)

是的,似乎存在性能差异。 我不会说很多。 这些结果来自iPad 3。

Spent 0.00033 seconds on writing ivar
Spent 0.00010 seconds on reading ivar
Spent 0.00279 seconds on writing ordinary
Spent 0.00200 seconds on reading ordinary
Spent 0.00835 seconds on writing runtime
Spent 0.00763 seconds on reading runtime

当运行这个

Test *test = [Test new];
int iterations = 10000;

logTimeSpentExecutingBlock(^{
    for(int i = 0; i < iterations; i++) {
        test->ivar = @"foo";
    }
}, @"writing ivar");

logTimeSpentExecutingBlock(^{
    for(int i = 0; i < iterations; i++) {
        test->ivar;
    }
}, @"reading ivar");

logTimeSpentExecutingBlock(^{
    for(int i = 0; i < iterations; i++) {
        test.ordinary = @"foo";
    }
}, @"writing ordinary");

logTimeSpentExecutingBlock(^{
    for(int i = 0; i < iterations; i++) {
        [test ordinary];
    }
}, @"reading ordinary");

logTimeSpentExecutingBlock(^{
    for(int i = 0; i < iterations; i++) {
        test.runtime = @"foo";
    }
}, @"writing runtime");

logTimeSpentExecutingBlock(^{
    for(int i = 0; i < iterations; i++) {
        [test runtime];
    }
}, @"reading runtime");

有了这个代码

void logTimeSpentExecutingBlock(dispatch_block_t block, NSString *label) {
    NSTimeInterval then = CFAbsoluteTimeGetCurrent();
    block();
    NSTimeInterval now = CFAbsoluteTimeGetCurrent();
    NSLog(@"Spent %.5f seconds on %@", now - then, label);
}

@interface Test : NSObject {
@public
    NSString *ivar;
}
@property (nonatomic, strong) NSString *ordinary;
@end

@interface Test (Runtime)
@property (nonatomic, strong) NSString *runtime;
@end

@implementation Test

- (void)setOrdinary:(NSString *)ordinary
{
    // the default implementation checks if the ivar is already equal
    _ordinary = ordinary;
}

@end

@implementation Test (Runtime)

- (NSString *)runtime {
    return objc_getAssociatedObject(self, @selector(runtime));
}

- (void)setRuntime:(NSString *)string {
    objc_setAssociatedObject(self, @selector(runtime), string, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

@end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM