簡體   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