Java SE 8 で Charset の改良

2014年3月17日 at 5:07 PM

Java SE 8 の新機能、改善点の一つに Charset の実装の改善があります。
これは charset のサイズを小さくし、エンコード、デコードのパフォーマンスを改善する事を目的としています。

実際、Java SE 7 の charset と Java SE 8 のサイズを比較してみると、下記コマンド実行例のように約 3.7 M ほどあったファイルが、3.1 M までスリム化しています。

追記 (2014 年 3 月 18 日):
山中 淳彦さん から本件に関して追加情報を頂きましたので、その内容を下記に共有いたします。

以降、山中 淳彦さんから頂いた情報:
横からすいません。私も興味があったのでチラッと調べてみました。言及されてる変更はJEP 112: Charset Implementation Improvements[1] で記述されてるもので、具体的な issue としては、JDK-6653797[2]JDK-7183053[3]が挙げられてますね。

前者、
By re-implemen/organize JDK’s charset implementation package
sun.nio.cs to achive the following goals

(1) decrease the size of the charsets.jar by 50% (from current 3.4M to below 1.7M).
(2) ease the maintenance cost (most charset implementation to be generated during
JDK build time from text based mapping tables)
(3) improve the performance (speed up the nio encoding/decoding performance)
(4) replace the current sun.io.* converters with an “adaptor” to re-direct the
sun.io encoding/decoding to nio.charset implementation t finally remove the
burden of maintain sun.io.

によって、十年来の目標だった JDK-4948149[4] での、sun.io.* の機能の sun.nio.cs.* への移管が達成され、やっと sun.io.* が削除されたということだと思われます。

後者は、“Faster new String(bytes, cs/csn) and String.getBytes(cs/csn)”[5]
によると、Java7 で single-byte の new String(bytes, cs/csn) のパフォーマンスが改善されたので、Java8 では、同様の hack が UTF-8 charset 文字にも施され、single byte、multi-byte 文字全てで、new String(bytes, cs/csn)、String.getBytes(cs/csn) のパフォーマンスが改善されたという話のようです。

[1] http://openjdk.java.net/jeps/112
[2] https://bugs.openjdk.java.net/browse/JDK-6653797
[3] https://bugs.openjdk.java.net/browse/JDK-7183053
[4] https://bugs.openjdk.java.net/browse/JDK-4948149
[5] https://blogs.oracle.com/xuemingshen/entry/faster_new_string_bytes_cs

追記2
JDK-7183053に関する変更[1]で、test/sun/nio/cs/StrCodingBenchmarkDB.java[2] が追加されてますが、codereview request for 7183053[3] でその効果が紹介されてました。

 The results of the “non -scientific” benchmark StrCodingBenchmarkDB
 running on client
 and server vm on my linux machine are included in docs_c (client) and
 docs_s(server)
 below.

http://cr.openjdk.java.net/~sherman/7183053/dbcs_c
http://cr.openjdk.java.net/~sherman/7183053/dbcs_s

よくわかってませんが、確かに速くなってるようです。

[1] http://hg.openjdk.java.net/hsx/hotspot-comp/jdk/rev/c76ad79a5a2f
[2] http://cr.openjdk.java.net/~sherman/dbcs_array/webrev/test/sun/nio/cs/StrCodingBenchmarkDB.java.html
[3] http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-July/010806.html

山中 淳彦さんから頂いた情報はここまで……


> ls -l /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/charsets.jar
-rw-rw-r– 1 root wheel 3696271 12 19 12:13 /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/lib/charsets.jar

> ls -l /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk//Contents/Home/jre/lib/charsets.jar
-rw-rw-r– 1 root wheel 3131343 2 2 01:24 /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk//Contents/Home/jre/lib/charsets.jar

実際に jar を展開して比較した所、sun.io.* が全て削除されている事が分かりました。また、その他にも日本語に関連した部分も含め改良が加わっている事が分かりました。比較の内容の詳細を下記にアップしましたのでどうぞご参照ください。

広告

Entry filed under: 未分類.

jBatch(JSR-352) on Java SE 環境 【祝】Java SE 8 正式リリース


Java Champion & Evangelist

ご注意

このエントリは個人の見解であり、所属する会社の公式見解ではありません

カレンダー

2014年3月
« 2月   4月 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

カテゴリー

Twitter

  • RT @jyukutyo: @yoshioterada てらださんには感謝しかありません!てらださんのそんなところを、カッコいいなと思っていました。ただ、いつまでもてらださんに甘えていてはいけないな、とも思い始めました。自分から話していくのはもちろん、僕が誰かのきっかけにもなり… 5 hours ago
  • @jyukutyo そう言って頂きまして誠にありがとうございます😊 そして、そのお心がけをとても嬉しく思います。 これから阪田さんを中心に良い輪が広がっていくと良いですね!!😄 これからもどうぞよろしくお願いします。 5 hours ago
  • RT @jyukutyo: 僕が本当に@yoshioterada さんに感謝しているのは、てらださんは昔から、日本でも海外でも、イベントで僕が横にいれば、自分が話している相手の方に、必ず僕のことを紹介してくれたことです。だから、僕もそれを、これからの方にやっていく! 6 hours ago
  • RT @KashiwaOwner: 観衆数百人の目線が自分に集まるなか、何度かシュートを外して恥ずかしさのあまり立ち去ろうとする女の子。 そんなときにNBAのスター、ステフィン・カリーが「入らないのは全然問題じゃない。大事なのは入るまで打ち続けること」と説く姿がイケメン過ぎる… 6 hours ago
  • RT @brendandburns: Secure serverless containers via @Azure Container Instances, AKS virtual nodes and @twistlockteam https://t.co/NoMi5qm… 6 hours ago

clustermap

ブログ統計情報

  • 1,099,419 hits

RSSフィード


%d人のブロガーが「いいね」をつけました。