タイトルの通りなのですが、Java 8では空文字列で数値から文字列に変換する方法は、速度が遅いらしいという情報を入手したので、確認したいと思います。
今回は、数値を文字列に変換する以下の2つの方法の速度を計測して比較してみようと思います。
- 計測方法1:String.valueOf(<数値>)
- 計測方法2:<数値> + ""(空文字列)
計測するためのプログラム
簡易な、Javaのプログラムで実際に速度を計測してみたいと思います。数値から文字列に変換する処理を100万回実行した速度を計測するためのプログラムです。
public class Sample { public static void main(String[] args) { long start = System.currentTimeMillis(); for (int i = 0; i < 1_000_000; i++) { //数値→文字列変換処理をここに実装 } long end = System.currentTimeMillis(); System.out.println((end - start) + "ms"); } }
計測方法1:String.valueOf(<数値>)
まずは、String.valueOf(<数値>)のやり方で実施してみます。以下のプログラムを5回実施して、その平均を取得します。
public class Sample { public static void main(String[] args) { long start = System.currentTimeMillis(); for (int i = 0; i < 1_000_000; i++) { String s = String.valueOf(i); } long end = System.currentTimeMillis(); System.out.println((end - start) + "ms"); } }
結果は、「75ms」でした。
計測方法2:<数値> + ""(空文字列)
次は、<数値> + ""(空文字列)のやり方で実施してみます。以下のプログラムを5回実施して、その平均を取得します。
public class Sample { public static void main(String[] args) { long start = System.currentTimeMillis(); for (int i = 0; i < 1_000_000; i++) { String s = i + ""; } long end = System.currentTimeMillis(); System.out.println((end - start) + "ms"); } }
結果は、「104.4ms」でした。
まとめ
まとめると以下の通りです。今回は処理自体が簡単でしたので、そこまで差がはっきりと出たわけではありませんが、事前情報の通り文字列による変換の方が遅いことが分かりました。
- 計測方法1:String.valueOf(<数値>) → 「75ms」
- 計測方法2:<数値> + ""(空文字列) → 「104.4ms」
また、これはあくまでJava 8による実行結果です。他のバージョン、たとえばJava 9では空文字列による変換処理が効率化されたようなので、環境によっては問題ないかもしれません。
空文字列による変換は、可読性が良いので私自身よく使っていたのですが、このような速度を意識した実装をしなくてはならない状況では意識して使い分ける必要がありそうです。
今回はこの辺で失礼いたします。最後までお読みいただきありがとうございました。