Java 7/8中字符集的編解碼
我們來看看在Java 7/8中字符集
編碼和解碼的性能。先看看下面兩個String
方法在不同字符集下的性能:
/* String to byte[] */ public byte[] getBytes(Charset charset); /* byte[] to String */ public String(byte bytes[], Charset charset);
我把“Develop with pleasure”通過谷歌翻譯為德語、俄語、日語和繁體中文。我們將根據這些短語構建指定大小的塊,通過使用“\n”作為分隔符來連接它們直到到達指定的長度(在大多數情況下,結果會稍長一些)。在那之后我們將100M字符的byte[]
數據轉化為String
數據(100M是Java中char
字符的總長度)。我們將轉換10遍以確保結果更加可靠(因此,在下表中是轉換10億字符的時間)。
我們將使用2個塊的大小:100個字符用于測試短字符串轉換的性能,100M字符用來測試最初的轉換性能,你可以在本文末尾找到文章的源代碼。我們會用UTF-8的方式與“本地化的”字符集進行比較(英語US-ASCII、德語ISO-8859-1、俄語windows-1251、日語Shift_JIS、繁體中文GB18030),將UTF-8作為通用編碼時這些信息會非常很有(通常意味著更大的二進制轉換開銷)。我們也會對比Java 7u51和Java 8(的版本特性)。為了避免GC帶來的影響,所有測試都是在我搭載Xmx32G的Xeon-2650(2.8Ghz)工作站上運行。
以下是測試結果。每個實例有兩個時間結果:Java7的時間(和Java8的時間)。”UTF-8″這一行遵循了每個“本地化的”字符集,它包含從前一行數據的轉換時間(例如,最后一行包括了string從繁體中文轉為UTF-8的編碼、解碼的時間)。
Charset | getBytes, ~100 chars (chunk size) | new String, ~100 chars (chunk size) | getBytes, ~100M chars | new String, ~100M chars | </tr>|||||||||||||||||||||||||
US-ASCII | 2.451 sec(2.686 sec) | 0.981 sec(0.971 sec) | 2.402 sec(2.421 sec) | 0.889 sec(0.903 sec) | </tr>|||||||||||||||||||||||||
UTF-8 | 1.193 sec(1.259 sec) | 0.974 sec(1.181 sec) | 1.226 sec(1.245 sec) | 0.887 sec(1.09 sec) | </tr>|||||||||||||||||||||||||
ISO-8859-1 | 2.42 sec(0.334 sec) | 0.816 sec(0.84 sec) | 2.441 sec(0.355 sec) | 0.761 sec(0.801 sec) | </tr>|||||||||||||||||||||||||
UTF-8 | 3.14 sec(3.534 sec) | 3.373 sec(4.134 sec) | 3.288 sec(3.498 sec) | 3.314 sec(4.185 sec) | </tr>|||||||||||||||||||||||||
windows-1251 | 5.85 sec(5.826 sec) | 2.004 sec(1.909 sec) | 5.881 sec(5.747 sec) | 1.902 sec(1.87 sec) | </tr>|||||||||||||||||||||||||
UTF-8 | 5.425 sec(5.256 sec) | 11.561 sec(12.326 sec) | 5.544 sec(4.921 sec) | 11.29 sec(12.314 sec) | </tr>|||||||||||||||||||||||||
Shift_JIS | 17.343 sec(9.355 sec) | 24.85 sec(8.464 sec) | 16.95 sec(9.24 sec) | 24.6 sec(8.503 sec) | </tr>|||||||||||||||||||||||||
UTF-8 | 9.398 sec(13.201 sec) | 12.007 sec(16.661 sec) | 9.681 sec(11.801 sec) | 12.035 sec(16.602 sec) | </tr>|||||||||||||||||||||||||
GB18030 | 18.754 sec(16.641 sec) | 15.877 sec(16.267 sec) | 18.494 sec(16.342 sec) | 16.034 sec(16.406 sec) | </tr>|||||||||||||||||||||||||
UTF-8 | 9.374 sec(11.829 sec) | 12.092 sec(16.672 sec) | 9.678 sec(12.991 sec) | 12.25 sec(16.745 sec) | </tr> </tbody> </table>