なになれ

IT系のことを記録していきます

Java SE 8のパフォーマンスを簡単に測定してみた

Java SE 8が最近リリースされました。
Java SE 8でJVMに対してパフォーマンスチューニングがされたということを聞き、簡単にパフォーマンスを測定してみました。

・測定方法
100万個のBeanをListに格納する時間を計測

・実行環境
JRE
 Java SE 6U45
 Java SE 7u51
 Java SE 8
IDE
 NetBeans IDE 8.0

・結果
Java SE 6U45 :平均113ms
Java SE 7U51 :平均174ms
Java SE 8 :平均346ms

SE 7から倍くらい遅いという結果になりました。なぜに!?
IDEでやるのがまずいのかと思って、コンソールでも試してみましたが変わらずでした。

測定プログラムは以下のとおり。

package sample;
import java.util.ArrayList;

public class Benchmark1 {

     public static void main(String[] args) {
          for(int j=0;j<10;j++){
              long currentTimeMillis = System.currentTimeMillis();
              ArrayList<User> list = new ArrayList<User>();
              Benchmark1 benchmark1 = new Benchmark1();
              for(int i = 0; i < 1000000; i++){
                  list.add(benchmark1.new User("テスト", "テスト県テスト市", "123456"));
              }
              System.out.println(list.size());
              System.out.println(System.currentTimeMillis() - currentTimeMillis);
          }
     }

     public class User{
          private String name;
          private String address;
          private String id;

          public User(String name, String address, String id) {
               super();
               this.name = name;
               this.address = address;
               this.id = id;
          }
          public String getName() {
               return name;
          }
          public void setName(String name) {
               this.name = name;
          }
          public String getAddress() {
               return address;
          }
          public void setAddress(String address) {
               this.address = address;
          }
          public String getId() {
               return id;
          }
          public void setId(String id) {
               this.id = id;
          }
     }

}


Java SE 8ということで、StreamAPIを使う方法でもやりました。結果は変わりませんでした。
mainメソッドを以下のように書き換え。

for(int j=0;j<10;j++){
      long currentTimeMillis = System.currentTimeMillis();
      Benchmark2 benchmark2 = new Benchmark2();
            Stream<User> generate = Stream.generate(() ->; benchmark2.new User("テスト","テスト県テスト市","123456"));
            List<User> list = generate.limit(1000000).collect(Collectors.toList());
            System.out.println(list.size());
      System.out.println(System.currentTimeMillis() - currentTimeMillis);
}

ただ、一概に今回の結果を捉えてはいけないかなと思います。
Java SE 8からJVMのメモリの利用効率を改善したということで、もっと複雑にJVMが動作するプログラムに対してパフォーマンス計測を行った場合にはどうなるかを計測しないといけないと思います。
例えば、Webアプリケーションとか。

時間があれば、別の形でパフォーマンス計測したいと思います。
Javaのバージョンを上げれば、パフォーマンスが上がりますと言えれば、Java8が業務で使える日も近づくかもしれませんので。