测试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 = .f; // 可变行高,乘因数
paragraphStyle.lineSpacing = .f; // 行间距
paragraphStyle.minimumLineHeight = .f; // 最小行高
paragraphStyle.maximumLineHeight = .f; // 最大行高
paragraphStyle.paragraphSpacing = .f; // 段间距
paragraphStyle.alignment = NSTextAlignmentLeft; // 对齐方式
paragraphStyle.firstLineHeadIndent = .f; // 段落首文字离边缘间距
paragraphStyle.headIndent = .f; // 段落除了第一行的其他文字离边缘间距
paragraphStyle.tailIndent = .f; // ???????
[storage addAttribute:NSParagraphStyleAttributeName
value:paragraphStyle
range:NSMakeRange(, storage.string.length)]; // 字体属性
[storage addAttribute:NSFontAttributeName
value:[UIFont fontWithName:CUSTOM_FONT(@"新蒂小丸子体", ) size:.f]
range:NSMakeRange(, storage.string.length)]; [storage addAttribute:NSForegroundColorAttributeName
value:[UIColor cyanColor]
range:NSMakeRange(, storage.string.length)]; [[GCDQueue mainQueue] execute:^{
// 文本容器的布局管理器
NSLayoutManager *layoutManager = [NSLayoutManager new]; NSLog(@"step 1");
// 开始渲染
[storage addLayoutManager:layoutManager]; NSLog(@"step 2"); // 分段显示文本容器中的内容
CGSize size = CGSizeMake(, );
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(, ,
size.width,
size.height + )
textContainer:textContainer1]; textView.layer.borderWidth = ;
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文档分割小一点,别无他法哦,至少我目前没有想到好的方法.

测试TextKit渲染大文本的效率的更多相关文章

  1. .Net搭建的WebService测试页使用TextArea大文本框方便调试

    用.Net搭建的WebService,系统默认提供了测试页,供大家输入参数进行测试.但因为参数输入框使用的是单行input控件,导致无法输入换行文本,使得有些参数(如换行的xml)无法输入,及其不便. ...

  2. 【Java】大文本字符串滤重的简单方案~

    本文章也同步至本人的CSDN博客中: http://blog.csdn.net/u012881584/article/details/70477832 今天来说一个Java中处理大文本字符串虑重的两个 ...

  3. Python之mmap内存映射模块(大文本处理)说明

    背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力.关于sed的说明可以看了解sed的工作原理,本文将介绍通过 ...

  4. jdbc基础 (三) 大文本、二进制数据处理

    LOB (Large Objects)   分为:CLOB和BLOB,即大文本和大二进制数据 CLOB:用于存储大文本 BLOB:用于存储二进制数据,例如图像.声音.二进制文件 在mysql中,只有B ...

  5. 利用JDBC处理mysql大数据--大文本和二进制文件等

    转载自http://www.cnblogs.com/xdp-gacl/p/3982581.html 一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob, ...

  6. sql 批处理、获取自增长、事务、大文本处理

    批处理 需要批量执行sql语句! 需求:批量保存信息! 设计: AdminDao Public void save(List<Admin list){ // 目前用这种方式 // 循环 // 保 ...

  7. 【转】Python之mmap内存映射模块(大文本处理)说明

    [转]Python之mmap内存映射模块(大文本处理)说明 背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力 ...

  8. oracle存储大文本clob、blob

    oracle存储大文本clob.blob 1 package cn.itcast.web.oracle.util; 2 3 import java.sql.Connection; 4 import j ...

  9. ElasticStack系列之十七 & 大文本搜索性能提升方案

    1. 什么是大文本?具体是什么? 首先需要理解,ElasticSearch 建立索引完成全文检索的前提是将待检索的信息导入到 ElasticSearch 中.而有的信息对应的正文内容会非常的打,可能达 ...

随机推荐

  1. centos7设置SSH安全策略–指定IP登陆

    之前自己搭建了个博客网站(理想三旬),写了些文章,但是由于一些原因慢慢将文章放在博客园了.所以这里将一些文章复制过来.便于以后自己查询. 为了服务器的安全性,我们在日常使用需要授予权限和指定ip登陆来 ...

  2. Druid连接池(四)

    十七.Druid加密 运维和DBA都不希望把密码明文直接写在配置文件中,Druid提供了数据库密码加密的功能. ConfigFilter的作用包括: 从配置文件中读取配置 从远程http文件中读取配置 ...

  3. RabbitMQ上手记录–part 6-Shovel

    上一part<RabbitMQ上手记录–part 5-节点集群高可用(多服务器)>讲到了通过多个服务器来搭建RabbitMQ的节点集群,示例当中提到的服务器都是在同一个局域网中的(实际上是 ...

  4. VF

    VF 描述 Vasya is the beginning mathematician. He decided to make an important contribution to the scie ...

  5. springboots 配置文件

    1.build.gradle buildscript { // 声明变量 ext { springBootVersion = '1.5.2.RELEASE' } // 仓库 repositories ...

  6. 本地启动activemq,报错解决

    本地启动activemq时,报错.可以看到是5672端口被占用.在网上查了各种资料,有说是杀掉进程的,有说是禁用Internet Connection Sharing (ICS)服务的,楼主试了都没生 ...

  7. C# 指针操作相关

    C# 指针操作相关 =========================================            // ** 取int 地址 以指针访问指向值 ** //         ...

  8. JavaScript shift()函数移出数组第一个数据

    pop() 函数用来移出数组中最后一个元素.如果想要移出第一个元素要怎么办呢? .shift() 就是专门用来处理这类型需求的.它的工作原理类似 .pop(),但它移除的是第一个元素,而不是最后一个.

  9. C#绑定数据

    1.<asp:DropDownList <asp:DropDownList ID="ddlclientType" runat="server" Wi ...

  10. Mysql最左匹配原则实践(原创)

    mysql最左匹配原则 什么叫最左匹配原则 最左匹配原则的误区 实战 结论: 1 条件查询中条件顺序没有关系 2 在最左匹配原则中,有如下说明: 最左前缀匹配原则,非常重要的原则,mysql会一直向右 ...