почему создание фреймсеттера с китайским текстом было очень медленным в iOS5

Я обнаружил, что использование 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) занимает большую часть времени, я не знаю, как оптимизировать, помогите


person bang    schedule 05.04.2012    source источник


Ответы (1)


Части C++ среды выполнения были в значительной степени, если не полностью, добавлены в iOS 5, и именно здесь она терпит неудачу. Для меня это говорит о том, что вы должны отправить отчет об ошибке в Apple или открыть запрос в своей учетной записи, если у вас остались.

person borrrden    schedule 05.04.2012
comment
э ... я не знаю, что вы имеете в виду - person bang; 05.04.2012
comment
Подождите... эта функция (GetNextLigature...) принадлежит вам или среде выполнения? - person borrrden; 05.04.2012
comment
Итак, что-то изменилось, чтобы сделать его медленнее. Насколько я могу судить, это ошибка в новой реализации iOS 5. Независимо от того, что вы делаете, вы не можете изменить эту функцию, поэтому я предлагаю связаться с Apple. - person borrrden; 06.04.2012
comment
должно быть какое-то решение, иначе почему программа для чтения электронных книг, такая как stanze/ibook, может быть такой быстрой - person bang; 06.04.2012