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