敏感詞性能調優系列
v0.29.0 敏感詞性能優化提升 14 倍全過程
v0.29.1 敏感詞性能優化之內部類+迭代器內部類
v0.29.2 敏感詞性能優化之基本類型拆箱、裝箱的進一步優化的嘗試
v0.29.3 敏感詞性能優化之繁簡體轉換 opencc4j 優化
背景
opencc4j
opencc4j 中,因為考慮到漢字的復雜性,可能存在繁簡體的多個對應和一個漢字,多個 char 的場景。
所以以前的實現比較復雜
private static char getChar(char c) {List<String> mappingList = ZhConverterUtil.toSimple(c);if(CollectionUtil.isEmpty(mappingList)) {return c;}return mappingList.get(0).charAt(0);}
這里涉及到多余的對象轉換。
優化思路
在 opencc4j 中提供簡化版本的繁簡體實現。
package com.github.houbb.opencc4j.util;import com.github.houbb.opencc4j.model.data.DataInfo;
import com.github.houbb.opencc4j.support.collection.Char2CharMap;
import com.github.houbb.opencc4j.support.data.impl.TSCharData;import java.util.List;
import java.util.Map;/*** 中文轉換簡化版** @since 1.14.0* @author 老馬嘯西風*/
public final class ZhSlimUtil {private ZhSlimUtil(){}private static final Char2CharMap char2CharMap;static {int size = 100;TSCharData tsCharData = new TSCharData();DataInfo dataInfo = tsCharData.data();Map<String, List<String>> dataList = dataInfo.getDataMap();// 這里如果有多個,只看第一個// 如果超過2個 char,直接跳過char2CharMap = new Char2CharMap(dataList.size());for(Map.Entry<String, List<String>> entry : dataList.entrySet()) {String key = entry.getKey();List<String> valueList = entry.getValue();char[] keys = key.toCharArray();char[] values = valueList.get(0).toCharArray();if(keys.length > 1 || values.length > 1) {continue;}char2CharMap.put(keys[0], values[0]);}}/*** 簡化版本* @param c 字符* @return 對應字符*/public static char toSimple(final char c) {return char2CharMap.get(c, c);}}
壓測對比
10w 次,這個方法性能平均大概提高了 6 倍左右。
小結
底層依賴的庫,果然還是可以自己修改最方便。
也最方便性能的拓展和優化。
開源地址
https://github.com/houbb/sensitive-word