--.--.--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2010.04.03

第373夜 其の1

javaのお勉強2日目・・・。

オート/アンボクシングのパフォーマンス(あくまで1例)について試してみた。遅いからループ中では使わない方がいいとよく聞きますが、では明示的に変換すると早くなるのか、そもそもループ中に変換が必要な処理を書いてはいけないのか、よくわからなかったので実際に試してみた。

実行例
func1の実行にかかった時間は 219 ミリ秒です。
func2の実行にかかった時間は 141 ミリ秒です。
func3の実行にかかった時間は 140 ミリ秒です。
※func2の方がfunc3よりも早い場合もありました。

こんな単純なケースだけだと何とも言えないかもしれませんが、確かにオート/アンボクシングはパフォーマンスによくないようです。
コードがすっきりするのでいい感じですが、ループ処理とかでは避けた方がいいかもしれません。

package sample;

import java.util.ArrayList;

public class Sample1 {

private static final int MAX = 1000000;

/**
* オート/アンボクシングのパフォーマンスについて(1例)
*/
public static void main(String[] args) {
func1();
func2();
func2();
}

/**
* オート/アンボクシング
*/
private static void func1() {
long start = System.currentTimeMillis();

ArrayList lst3 = new ArrayList(MAX);
ArrayList lst4 = new ArrayList(MAX);

for (int i = 0; i < MAX; i++) {
lst3.add(i);
}

for (Integer n : lst3) {
int ret = n;
}

long stop = System.currentTimeMillis();

System.out.println("func1の実行にかかった時間は " + (stop - start) + " ミリ秒です。");
}

/**
* 明示的にプリミティブに変換
*/
private static void func2() {
long start = System.currentTimeMillis();

ArrayList lst3 = new ArrayList(MAX);
ArrayList lst4 = new ArrayList(MAX);

for (int i = 0; i < MAX; i++) {
lst3.add(Integer.valueOf(i));
}

for (Integer n : lst3) {
int ret = n.intValue();
}

long stop = System.currentTimeMillis();

System.out.println("func2の実行にかかった時間は " + (stop - start) + " ミリ秒です。");
}

/**
* プリミティブを使わない。
*/
private static void func3() {
long start = System.currentTimeMillis();

ArrayList lst3 = new ArrayList(MAX);
ArrayList lst4 = new ArrayList(MAX);

for (Integer i = 0; i < MAX; i++) {
lst3.add(i);
}

for (Integer n : lst3) {
Integer ret = n;
}

long stop = System.currentTimeMillis();

System.out.println("func1の実行にかかった時間は " + (stop - start) + " ミリ秒です。");
}

}
この記事へのトラックバックURL
http://hexagram.blog41.fc2.com/tb.php/401-a309114d
この記事へのトラックバック
この記事へのコメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。