【问题标题】:What is the fastest way to convert a long long to NSString将 long long 转换为 NSString 的最快方法是什么
【发布时间】:2013-12-12 17:50:31
【问题描述】:

我需要将很多 long long 转换为 NSString。最快的方法是什么?我知道有两种方法可以做到这一点,我想知道是否还有其他更快的方法。

NSString* str = [NSString stringWithFormat:@"%lld", val];

NSString* str = [[NSNumber numberWithLongLong:val] stringValue];

其中 val 是 long long(64 位 int)。第一种方法解析字符串的开销很小,第二种方法有分配额外对象的开销。很可能 NSNumber 使用 NSString 的 stringWithFormat,但我不确定。

有没有人知道更快的方法?

【问题讨论】:

  • 方法 1 的运行速度有多快?您想要达到多快?
  • 我认为差异不值得担心。
  • 您需要一次拥有所有字符串,还是可以重用可变字符串?你确定这条线是性能问题吗?
  • 过早优化?做容易的事。如果您以后遇到性能问题,请使用 Instruments 并查看瓶颈在哪里。

标签: ios objective-c nsstring


【解决方案1】:

我整理了一个基本的分析应用程序。我尝试了您的两种方法,以及 Rob Mayoff 的两种方法。

stringWithFormat: 平均耗时 0.000008 秒。其他三种方法(在 numberWithLongLong: 上调用 stringValue)和 Rob 的两种方法,平均耗时 0.000011 秒。

这是我的代码。这显然不是 100% 准确的,因为配置文件中还包含一些其他操作,但所有测试中的差异都是相同的:

- (void) startProfiling {
    self.startDate = [NSDate date];
}

- (NSTimeInterval) endProfiling {
    NSDate *endDate = [NSDate date];
    NSTimeInterval time = [endDate timeIntervalSinceDate:self.startDate];
    self.startDate = nil;
    NSLog(@"seconds: %f", time);
    return time;
}

- (void)doTest:(id)sender {
    long long val = 1234567890987654321;

    NSTimeInterval totalTime = 0;

    for (int i = 0; i < 1000; i++) {
        [self startProfiling];

        // change this line for each test
        NSString* str = [NSString stringWithFormat:@"%lld", val];

        totalTime += [self endProfiling];
    }

    NSLog(@"average time: %f", totalTime / 1000);
}

【讨论】:

    【解决方案2】:

    这是打字速度最快的:

    NSString *string = @(val).description;
    

    这需要一个额外的按键:

    NSString *string = @(val).stringValue;
    

    如果您的意思是在运行时最快,唯一确定的方法是尝试两种方式并查看。 个人资料。不要猜测。

    【讨论】:

    • 您不应该将description 用于非调试目的。
    • 你能指点我说的苹果文档吗?因为我在debugDescription 的文档中看到了这一点,但在description 的文档中没有看到。
    • @HotLicks 虽然我同意你的观点,但我保证你会使用一个例外 - NSString
    • 显然该规则在 iOS 5 中发生了变化,可能是因为它被普遍忽略了。
    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2011-04-07
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多