gpt4 book ai didi

ios - 为什么使用 HTML 字符串对 NSAttributedString 的初始调用比后续调用要长 100 多倍?

转载 作者:IT王子 更新时间:2023-10-29 08:03:18 25 4
gpt4 key购买 nike

我需要在我的 iOS 应用中显示 HTML 文本。我决定在 NSAttributedString 上使用内置方法,initWithData:options:documentAttributes:error: .实际的解析工作非常好,但是,我似乎遇到了一个非常奇怪的错误,它似乎只有在我附加了调试器时才会出现。

第一次调用此方法时,在运行 iOS 7.0.4 的 iPhone 5S 上运行仅需不到 1 秒,在第 5 代 iPod Touch 上运行约 1.5 秒。这个怪癖也会在模拟器上表现出来,但由于模拟器的绝对速度,它不太明显。

后续调用仅需 10-50 毫秒左右,比初始调用快得多。

这似乎与输入字符串的缓存无关,因为我已经在我的“真实”应用程序中使用多个输入字符串对其进行了测试。

但是,当我在没有调试器的情况下运行该程序时,它会按预期运行,大约需要 10-20 毫秒,这是我期望的 HTML 解析时间。

这里是相关的代码部分:

-(void) benchmarkMe:(id)sender {
NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding];

NSTimeInterval startTime = [[NSDate date] timeIntervalSinceReferenceDate];

// So the complier doesn't keep complaining at me.
__attribute__((unused))
NSAttributedString *parsed = [[NSAttributedString alloc] initWithData:data
options:@{
NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)
}
documentAttributes:nil
error:nil];

NSTimeInterval endTime = [[NSDate date] timeIntervalSinceReferenceDate];

NSString *message = [NSString stringWithFormat:@"Took %lf seconds.", endTime - startTime];

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Benchmark complete!"
message:message
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alertView show];
}

注意:此处提供了演示此错误的完整工作项目:
https://github.com/richardjrossiii/NSAttributedStringHTMLBug

我疯了吗?我在这里缺少什么吗?当我尝试优化我的应用程序以提高性能时,1 秒是非常长的时间。

我目前的解决方案是在应用程序启动时解析一个“虚拟”字符串,但这似乎是一个令人难以置信的 hacky 解决方法。

最佳答案

这真是个好问题。事实证明(至少对我而言)我第一次调用该方法时总是比较慢,无论是否连接了调试器。原因如下:第一次解析 HTML 属性字符串时,iOS 将整个 JavaScriptCore 引擎和 WebKit 加载到内存中。观看:

我们第一次运行该方法(在解析字符串之前)只存在 3 个线程:

screenshot 1

字符串解析后,我们有11个线程:

screenshot 2

现在我们下次运行该方法时,大多数与网络相关的线程仍然存在:

screenshot 3

这就解释了为什么第一次很慢,然后很快。

关于ios - 为什么使用 HTML 字符串对 NSAttributedString 的初始调用比后续调用要长 100 多倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21166752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com