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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章