测试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 = .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渲染大文本的效率的更多相关文章
- .Net搭建的WebService测试页使用TextArea大文本框方便调试
用.Net搭建的WebService,系统默认提供了测试页,供大家输入参数进行测试.但因为参数输入框使用的是单行input控件,导致无法输入换行文本,使得有些参数(如换行的xml)无法输入,及其不便. ...
- 【Java】大文本字符串滤重的简单方案~
本文章也同步至本人的CSDN博客中: http://blog.csdn.net/u012881584/article/details/70477832 今天来说一个Java中处理大文本字符串虑重的两个 ...
- Python之mmap内存映射模块(大文本处理)说明
背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力.关于sed的说明可以看了解sed的工作原理,本文将介绍通过 ...
- jdbc基础 (三) 大文本、二进制数据处理
LOB (Large Objects) 分为:CLOB和BLOB,即大文本和大二进制数据 CLOB:用于存储大文本 BLOB:用于存储二进制数据,例如图像.声音.二进制文件 在mysql中,只有B ...
- 利用JDBC处理mysql大数据--大文本和二进制文件等
转载自http://www.cnblogs.com/xdp-gacl/p/3982581.html 一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob, ...
- sql 批处理、获取自增长、事务、大文本处理
批处理 需要批量执行sql语句! 需求:批量保存信息! 设计: AdminDao Public void save(List<Admin list){ // 目前用这种方式 // 循环 // 保 ...
- 【转】Python之mmap内存映射模块(大文本处理)说明
[转]Python之mmap内存映射模块(大文本处理)说明 背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力 ...
- oracle存储大文本clob、blob
oracle存储大文本clob.blob 1 package cn.itcast.web.oracle.util; 2 3 import java.sql.Connection; 4 import j ...
- ElasticStack系列之十七 & 大文本搜索性能提升方案
1. 什么是大文本?具体是什么? 首先需要理解,ElasticSearch 建立索引完成全文检索的前提是将待检索的信息导入到 ElasticSearch 中.而有的信息对应的正文内容会非常的打,可能达 ...
随机推荐
- CRF两个例子的理解
概率计算例子: 预测例子:
- java-TreeSet进行排序的2种方式
TreeSet和HashSet的区别在于, TreeSet可以进行排序, 默认使用字典顺序排序, 也可以进行自定义排序 1, 自然排序 2, 比较器排序 自然排序: 1, 需要被排序的类实现Compa ...
- 面试题22:有序数组生成不同结构BST
对于一个含有n个数的有序数组1~N,能够产生多少种不同结果的二叉搜素树BST? 如何生成这些不同结构的BST? 有序数组如何生成平衡二叉搜索树? class Solution { public: in ...
- Spark程序本地运行
Spark程序本地运行 本次安装是在JDK安装完成的基础上进行的! SPARK版本和hadoop版本必须对应!!! spark是基于hadoop运算的,两者有依赖关系,见下图: 前言: 1.环境 ...
- Object-C语言Block的实现方式
开场白 Block基本概念 中间态转换方法 Block编译后结果分析 Block运行时状态与编译状态对比 开场白 Object-C语言是对C语言的扩展,所以将OC源码进行编译的时候,会将OC源 ...
- JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- DotNet Core 2.0部署后外网IP访问
将DotNet Core2.0项目部署在Ubuntu上并且运行后,可以用localhost:5000来访问. 但是如果这时候用外网来访问就不行了. 这时候就有两种解决方案,第一种是用Nginx做代理实 ...
- Spring-boot简单的理解
SpringBoot启动 SpringApplication.run(MyBootApplication.class); SpringApplication.run启动SpringBoot应用,主要过 ...
- [日常] MySQL内存不足启动失败的解决方法
1.启动mysql时,一直不成功,查看错误日志 /var/log/mysql/error.log 2.主要的错误信息有如下几条: [ERROR] InnoDB: mmap(136151040 byte ...
- 使用DOM解析xml文件
使用DOM解析xml文件 要解析的xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <Langu ...