适用于Java和Android的快速、低内存占用的汉字转拼音库。
特性
生成的拼音不包含声调,也不处理多音字,默认一个汉字对应一个拼音;
拼音均为大写;
无需初始化,执行效率很高(Pinyin4J的4倍);
很低的内存占用(小于30KB)。
使用
API
/**
* 如果c为汉字,则返回大写拼音;如果c不是汉字,则返回String.valueOf(c)
*/
String Pinyin.toPinyin(char c)
/**
* c为汉字,则返回true,否则返回false
*/
boolean Pinyin.isChinese(char c)
添加到工程
buildscript {
repositories {
jcenter()
}
dependencies {
compile 'com.github.promeg:tinypinyin:1.0.0' // ~80KB
}
}
详细说明
1. 设计目标
Pinyin4J的问题
Jar文件较大,205KB;
Pinyin4J的PinyinHelper.toHanyuPinyinStringArray 在第一次调用时耗时非常长(~2000ms);
功能臃肿,许多情况下我们不需要声调、方言,(暂时)也不需要处理一字多音的情况;
内存占用太高;
TinyPinyin特性
转换后的结果? 不
?包含声调和方言,也? 不
?处理多音字,默认一个汉字仅对应一个拼音;
无需初始化,保证多次调用时,有稳定的返回时间;
尽可能低的内存占用;
比Pinyin4J更快的转换速度。
2. Correctness
以Pinyin4J作为基准,确保对所有的字符(Character.MAX_VALUE ~ Character.MIN_VALUE),TinyPinyin与Pinyin4J有相同的返回结果。
(Pinyin4J采用无声调的输出,多音字取第一个拼音进行对比)
该部分请见PinyinTest.java
采用以下命令运行test:
./gradlew :lib:test
3. Effectiveness
速度
使用 JMH
工具得到bechmark,对比TinyPinyin和Pinyin4J的运行速度。
具体测例请见PinyinSampleBenchmark.java。
采用以下命令运行benchmark:
./gradlew :lib:jmh
生成的报告在 pinyinhelper/build/reports/jmh/ 中,运行一次约耗时 5min。
Benchmark
Mode
Samples
Score
Unit
TinyPinyin.isChinese
thrpt
40
181
ops/us
TinyPinyin.isChinese(内存优化后)
thrpt
40
185
ops/us
Pinyin4J.isChinese
thrpt
40
39
ops/us
TinyPinyin.toPinyin
thrpt
40
174
ops/us
TinyPinyin.toPinyin(内存优化后)
thrpt
40
160
ops/us
Pinyin4J.toPinyin
thrpt
40
40
ops/us
内存占用
3个static byte[7000] 存储所有汉字的拼音的低8位,占用7000 * 1 * 3 = 21KB 内存;
3个static byte[7000/8] 存储所有汉字的拼音的第9位(最高位),占用7000 / 8 * 1 * 3 = 3KB 内存;
一个String[408] 存储所有可能的拼音,占用 1.7KB 内存;
共占用 < 30KB.