Android切词工具——BreakIterator(2)

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次 25 0 282
第2次 10 0 253
第3次 0 0 0
第4次 0 0 0

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

测试序号 获取BreakIterator实例 设置文本 切词
第1次 23 0 271
第2次 9 0 257
第3次 0 0 6
第4次 0 0 8

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

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

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

测试序号 获取BreakIterator实例 设置文本 切词
第1次 20 0 274
第2次 0 0 0
第3次 0 0 1
第4次 0 0 0

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

测试序号 获取BreakIterator实例 设置文本 切词
第1次 24 1 269
第2次 0 0 3
第3次 0 0 2
第4次 0 0 3

测试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%。

你可能感兴趣的:(Android切词工具——BreakIterator(2))