Я обнаружил, что использование CTFramesetterCreateWithAttributedString для создания фреймсеттера с китайской строкой в iOS5 было очень медленным, а в iOS4 — быстрым.
Я провел такой тест: (chinese.txt содержит 77571 китайских символов, а english.txt содержит 233727 символов)
NSString *englishCtn = [NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", [self documentDirectory], @"english.txt"] encoding:NSUTF8StringEncoding error:nil];
NSAttributedString *englishCtnA = [[NSAttributedString alloc] initWithString:englishCtn];
NSString *chineseCtn = [NSString stringWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", [self documentDirectory], @"chinese.txt"] encoding:NSUTF8StringEncoding error:nil];
NSAttributedString *chineseCtnA = [[NSAttributedString alloc] initWithString:chineseCtn];
double start = [[NSDate date] timeIntervalSince1970];
CTFramesetterCreateWithAttributedString((CFAttributedStringRef)englishCtnA);
NSLog(@"english length:%d time %f", englishCtn.length, ([[NSDate date] timeIntervalSince1970] - start) * 1000);
start = [[NSDate date] timeIntervalSince1970];
CTFramesetterCreateWithAttributedString((CFAttributedStringRef)chineseCtnA);
NSLog(@"chinese length:%d time %f", chineseCtnA.length, ([[NSDate date] timeIntervalSince1970] - start) * 1000);
в iOS 5 результат:
Китайская длина: 77571 время: 12140.347004
английская длина: 233727 время: 75.886011
в iOS 4 результат:
Китайская длина: 77571 время: 53.114176
английская длина: 233727 время: 55.696011
Я использую профилировщик времени инструмента xCode, чтобы посмотреть, что происходит, я обнаружил, что функция TRun::GetNextLigatureCandidateCharRange(long) занимает большую часть времени, я не знаю, как оптимизировать, помогите