Android切词工具——BreakIterator(2)

xiaoxiao2021-02-28  129

4.性能怎么样?

4.1 计算耗时

再来看看切词过程:

public static ArrayList<String> breakSentence(final String sentence) { final ArrayList<String> result = new ArrayList<String>(); if (!TextUtils.isEmpty(sentence)) { Log.i("TEST_PERFORMANCE", "1 ... "); final BreakIterator boundary = BreakIterator.getWordInstance(); Log.i("TEST_PERFORMANCE", "2 ... "); boundary.setText(sentence); Log.i("TEST_PERFORMANCE", "3 ... "); try { Log.i("TEST_PERFORMANCE", "4 ... "); int start = boundary.first(); for (int end = boundary.next(); end != BreakIterator.DONE; start = end, end = boundary.next()) { String word = sentence.substring(start, end); if (!TextUtils.isEmpty(word)) { result.add(word); } } Log.i("TEST_PERFORMANCE", "5 ... "); } catch (IndexOutOfBoundsException e) { e.printStackTrace(); result.clear(); } } return result; }

由三个阶段构成: (1)获取BreakIterator实例: final BreakIterator boundary = BreakIterator.getWordInstance(); (2)设置文本: boundary.setText(sentence); (3)切词(代码以迭代器风格直接给出结果) 如代码所示,log打点看耗时,结果如下。耗时单位为ms。测试手机为一部红米3s,android 6.0.1。


切词“看视频”,手动点击4次

测试序号获取BreakIterator实例设置文本切词第1次250282第2次100253第3次000第4次000

切句子“杨振宁,1922年10月1日出生于安徽合肥,现任香港中文大学讲座教授、清华大学教授、美国纽约州立大学石溪分校荣休教授[1] ,是中国科学院院士、美国国家科学院院士、台湾“中央研究院”院士、俄罗斯科学院院士、英国皇家学会会员,1957年获诺贝尔物理学奖;是中美关系松动后回中国探访的第一位华裔科学家,积极推动中美文化交流和中美人民的互相了解;在促进中美两国建交、中美人才交流和科技合作等方面,做出了重大贡献。”手动点击4次

测试序号获取BreakIterator实例设置文本切词第1次230271第2次90257第3次006第4次008

代码连续切词4个:看视频、听音乐、看小说、遥控器

测试序号获取BreakIterator实例设置文本切词看视频230271听音乐000看小说000遥控器000

代码连续切词4次:看视频

测试序号获取BreakIterator实例设置文本切词第1次200274第2次000第3次001第4次000

代码连续切句4次:“杨振宁,1922年10月1日出生于安徽合肥,现任香港中文大学讲座教授、清华大学教授、美国纽约州立大学石溪分校荣休教授[1] ,是中国科学院院士、美国国家科学院院士、台湾“中央研究院”院士、俄罗斯科学院院士、英国皇家学会会员,1957年获诺贝尔物理学奖;是中美关系松动后回中国探访的第一位华裔科学家,积极推动中美文化交流和中美人民的互相了解;在促进中美两国建交、中美人才交流和科技合作等方面,做出了重大贡献。”

测试序号获取BreakIterator实例设置文本切词第1次241269第2次003第3次002第4次003

测试App进程重启之后,连续测试4次,切词在工作线程中执行。分析数据: (1)首次获取切词器实例,耗时大概20ms。之后耗时锐减:如果手动点击,第二次耗时大概10m,其后基本无耗时;如果是代码级的顺序执行,则从第二次起基本无耗时。实例化方法应该是使用了懒加载。手动点击间隔比较大,或许期间有些资源释放或者GC行为,导致第二次时间较长? (2)设置文本基本无耗时。应该只是一个引用。 (3)切词操作的耗时,第一次时间非常长,200ms+,但对于几个字和几百字区别不大。手动点击第二次仍然耗时长,第三次及以后耗时锐减;代码级的顺序执行,则从第二次起耗时锐减。锐减之后的耗时跟文本长度相关,几个字基本为0,几百字则有不到10ms的耗时。 (4)整体而言,首次初始化及切词耗时较长。

4.2 内存占用

使用Android Monitor观察JVM Heap内存和CPU情况: (1)每次都在手动GC后,触发切词(完整的三阶段),内存增长约4M,CPU瞬间占有率峰值约2%。 (2)只触发一次GC,之后多次触发切词(完整的三阶段)。第一次同(1);第二次及以后内存增长约0.5M,CPU瞬间占有率峰值约1%。

转载请注明原文地址: https://www.6miu.com/read-17434.html

最新回复(0)