测试TextKit渲染大文本的效率

简介:

测试TextKit渲染大文本的效率

 

TextKit可以用来做精美的电子书,而电子书通常都是txt格式的,那么渲染txt格式的文本的效率如何呢?

以下来进行测试.

#import "RootViewController.h"
#import "FontPool.h"
#import "YXGCD.h"

@interface RootViewController ()<NSLayoutManagerDelegate>

@end

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blackColor];
    
    [[GCDQueue globalQueue] execute:^{
        NSLog(@"start");
        
        // 数据源
        NSString *string = [NSString stringWithContentsOfURL:[NSBundle.mainBundle URLForResource:@"bubizhidaowoshishui" withExtension:@"txt"] usedEncoding:nil
                                                       error:nil];
        
        // 文本容器
        NSTextStorage *storage = [[NSTextStorage alloc] initWithString:string];
        
        // 段落属性
        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.lineHeightMultiple  = 1.f;                    // 可变行高,乘因数
        paragraphStyle.lineSpacing         = 5.f;                    // 行间距
        paragraphStyle.minimumLineHeight   = 10.f;                   // 最小行高
        paragraphStyle.maximumLineHeight   = 20.f;                   // 最大行高
        paragraphStyle.paragraphSpacing    = 10.f;                   // 段间距
        paragraphStyle.alignment           = NSTextAlignmentLeft;    // 对齐方式
        paragraphStyle.firstLineHeadIndent = 30.f;                   // 段落首文字离边缘间距
        paragraphStyle.headIndent          = 0.f;                    // 段落除了第一行的其他文字离边缘间距
        paragraphStyle.tailIndent          = 0.f;                    // ???????
        [storage addAttribute:NSParagraphStyleAttributeName
                        value:paragraphStyle
                        range:NSMakeRange(0, storage.string.length)];
        
        // 字体属性
        [storage addAttribute:NSFontAttributeName
                        value:[UIFont fontWithName:CUSTOM_FONT(@"新蒂小丸子体", 0) size:15.f]
                        range:NSMakeRange(0, storage.string.length)];
        
        [storage addAttribute:NSForegroundColorAttributeName
                        value:[UIColor cyanColor]
                        range:NSMakeRange(0, storage.string.length)];
        
        [[GCDQueue mainQueue] execute:^{
            // 文本容器的布局管理器
            NSLayoutManager *layoutManager = [NSLayoutManager new];
            
            NSLog(@"step 1");
            // 开始渲染
            [storage addLayoutManager:layoutManager];
            
            NSLog(@"step 2");
            
            // 分段显示文本容器中的内容
            CGSize size = CGSizeMake(300, 520);
            NSTextContainer *textContainer1 = [[NSTextContainer alloc] initWithSize:size];
            [layoutManager addTextContainer:textContainer1];
            
            
            NSTextContainer *textContainer2 = [[NSTextContainer alloc] initWithSize:size];
            [layoutManager addTextContainer:textContainer2];
            
            
            NSTextContainer *textContainer3 = [[NSTextContainer alloc] initWithSize:size];
            [layoutManager addTextContainer:textContainer3];
            
            NSLog(@"step - 3");
            UITextView *textView = \
                [[UITextView alloc] initWithFrame:CGRectMake(10, 20,
                                                             size.width,
                                                             size.height + 20)
                                    textContainer:textContainer1];
            
            textView.layer.borderWidth = 1;
            textView.scrollEnabled     = NO;
            textView.backgroundColor   = [UIColor clearColor];
            textView.editable          = NO;
            [self.view addSubview:textView];
            
            NSLog(@"step - 4");
        }];
    }];
}

@end

测试的文本为310K大小

以下是测试结果:

2014-06-06 08:31:00.406 TextKit[4922:1803] start
2014-06-06 08:31:00.437 TextKit[4922:60b] step 1
2014-06-06 08:31:01.374 TextKit[4922:60b] step 2
2014-06-06 08:31:01.376 TextKit[4922:60b] step - 3
2014-06-06 08:31:02.211 TextKit[4922:60b] step - 4

从结果中,我们能发现一个规律哦:

当storage添加layoutManager的时候,此时就已经开始进行一些计算处理了,当我把[storage addLayoutManager:layoutManager];移动到子线程中运行的时候,就会发现后面的UITextView渲染不出文本了,这很容易理解,因为,只有在UI线程(主线程)中执行了渲染操作才会被显示出来,所以,NSTextStorage在添加NSLayoutManager的时候,就已经开始进行布局渲染了.310k的文本花了将近1秒.加上后面的UITextView加载又花了将近1秒,总共花了将近2秒......

也就是说,渲染300k的文本会在主线程上阻塞2秒的时间,这个延时感用户很难接受吧.....

有没有什么解决方案呢?

除了把txt文档分割小一点,别无他法哦,至少我目前没有想到好的方法.

目录
相关文章
|
8月前
|
Web App开发 前端开发 JavaScript
SAP UI5 应用开发教程之八十五 - 如何用 OPA5 编写测试用例来测试用户输入文本的功能试读版
SAP UI5 应用开发教程之八十五 - 如何用 OPA5 编写测试用例来测试用户输入文本的功能试读版
35 0
|
9月前
|
人工智能 JSON 自然语言处理
超越界限:大模型应用领域扩展,探索文本分类、文本匹配、信息抽取和性格测试等多领域应用
超越界限:大模型应用领域扩展,探索文本分类、文本匹配、信息抽取和性格测试等多领域应用
超越界限:大模型应用领域扩展,探索文本分类、文本匹配、信息抽取和性格测试等多领域应用
|
机器学习/深度学习 自然语言处理 算法
GPT-3 vs Bert vs GloVe vs Word2vec 文本嵌入技术的性能对比测试
本文将GPT3与三种传统文本嵌入技术GloVe、Word2vec(Mikolov ,2013 年)和 BERT生成的嵌入进行性能的简单对比。
503 0
GPT-3 vs Bert vs GloVe vs Word2vec 文本嵌入技术的性能对比测试
|
测试技术
|
数据采集 前端开发 JavaScript
【React高级】 数据获取然后进行创建测试(使用多渲染器以及计时器)
【React高级】 数据获取然后进行创建测试(使用多渲染器以及计时器)
|
测试技术 Python
Pytest----如何执行文本测试
Pytest----如何执行文本测试
99 0
|
自然语言处理
NLP之TEA:基于SnowNLP实现自然语言处理之对输入文本进行情感分析(分词→词性标注→拼音&简繁转换→情感分析→测试)
NLP之TEA:基于SnowNLP实现自然语言处理之对输入文本进行情感分析(分词→词性标注→拼音&简繁转换→情感分析→测试)
|
SQL 自然语言处理 关系型数据库
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.8. 测试和调试文本搜索
12.8. 测试和调试文本搜索 12.8.1. 配置测试 12.8.2. 解析器测试 12.8.3. 词典测试 一个自定义文本搜索配置的行为很容易变得混乱。本节中描述的函数对于测试文本搜索对象有用。
1158 0

热门文章

最新文章