所以只是为了好玩,我决定用各种方法来计时。这绝不是一项科学测试,主要是为了娱乐,但你们中的一些人可能还是想看看。
我创建了一个方法并替换了各种例程来处理表示数字 0 到 100,000 的字符串,所有这些字符串都带有三个前导 0。
但请记住,如果您只有一个(甚至一百个)这些字符串要修剪,那么即使是最慢的方法也完全可以接受。 (使用数字格式化程序大约需要 0.000012039905 秒,或大约 1/100 毫秒。)除非您确实需要处理一个充满像这样的字符串。我个人最喜欢的仍然是正则表达式,因为它相对较快,并且即使没有文档,您想要完成的what 也很明显。
以下是结果(从最快到最慢):
遍历字符串
// I tried this by looping through the utf8String and got the same times
// (actually, ever so slightly longer, probably since it had to create the c string)
//
// I did find that using `[string getCharacters:buffer range:range]` and
// iterating over the character buffer that it took another 0.01 seconds
// off the time. Hardly worth it though. :)
NSUInteger length = [string length];
for (NSUInteger i = 0; i < length; i++)
{
if ([string characterAtIndex:i] != '0')
{
return [string substringFromIndex:i];
}
}
return @"0";
// Time 1: 0.210126
// Time 2: 0.219159
// Time 3: 0.201496
转换为 int 再转换回 NSString
int num = [string intValue];
return [NSString stringWithFormat:@"%d", num];
// Time 1: 0.322206
// Time 2: 0.345259
// Time 3: 0.324954
long long num = [string longLongValue];
return [NSString stringWithFormat:@"%lld", num];
// Time 1: 0.364318
// Time 2: 0.344946
// Time 3: 0.364761
// These are only slightly slower, but you can do bigger numbers using long long
使用 NSScanner
NSScanner *scanner = [NSScanner scannerWithString:string];
NSCharacterSet *zeros = [NSCharacterSet
characterSetWithCharactersInString:@"0"];
[scanner scanCharactersFromSet:zeros intoString:NULL];
return [string substringFromIndex:[scanner scanLocation]];
// Time 1: 0.505277
// Time 2: 0.481884
// Time 3: 0.487209
使用正则表达式
NSRange range = [string rangeOfString:@"^0*" options:NSRegularExpressionSearch];
return [string stringByReplacingCharactersInRange:range withString:@""];
// Time 1: 0.610879
// Time 2: 0.645335
// Time 3: 0.637690
使用静态数字格式化程序
static NSNumberFormatter *formatter = nil;
if (formatter == nil)
{
formatter = [NSNumberFormatter new];
formatter.numberStyle = NSNumberFormatterDecimalStyle;
}
NSNumber *number = [formatter numberFromString:string];
return [formatter stringFromNumber:number];
// Time 1: 1.774198
// Time 2: 1.753013
// Time 3: 1.753893
使用数字格式化程序
NSNumberFormatter *formatter = [NSNumberFormatter new];
formatter.numberStyle = NSNumberFormatterDecimalStyle;
NSNumber *number = [formatter numberFromString:string];
return [formatter stringFromNumber:number];
// Time 1: 11.978336
// Time 2: 12.039905
// Time 3: 11.904984
// No wonder Apple recommends reusing number formatters!