2016-11-01 4 views
0

プリミティブデータ型の実行時間と、同じ数を数えるためのラッパークラスを測定しようとしました。そのラッパークラスは、基本的なデータ型よりも時間がかかっています。プリミティブデータ型のパフォーマンス対ラッパークラス

次のコードで、プリミティブt1 = 5の実行時間とラッパークラスt2 = 31の実行時間。

import java.io.*; 
import java.util.*; 
public class Performance 
{ 
    public static long primitive(int count) 
    { 
    long startTime = System.currentTimeMillis(); 
    for(int i=0;i<10000;i++) 
    count++; 
    System.out.println(count); 
    long stopTime = System.currentTimeMillis(); 
    long elapsedTime = stopTime - startTime; 
    return elapsedTime; 
} 
    public static long wrapper(Integer count) 
{ 
    long startTime = System.currentTimeMillis(); 
    for(int i=0;i<10000;i++) 
     count++; 
     System.out.println(count); 
    long stopTime = System.currentTimeMillis(); 
    long elapsedTime = stopTime - startTime; 
    return elapsedTime; 
} 

    public static void main(String args[]) 
    { 

    Integer c = new Integer(0); 
    long t2=Performance.wrapper(c); 
    int count=0; 
    long t1=Performance.primitive(count); 
    System.out.println("t1="+t1+"t2="+t2); 

    } 
} 

Wrapperクラス(Integer)などのオブジェクト作成によるパフォーマンスの違いはありますか?

ご了承ください。

ありがとうございます。

+0

ラッパーを自分で作成する代わりに、キャスト/オートボックスを使用してみてください。 '整数 'はバイト範囲内にキャッシュされます。それにもかかわらず、マイクロベンチマーキングの方法は、正確な結果(jvmウォームアップ、より多くの実行、ナノとミリ秒など)に必要なものと同程度ではありません。 – Rogue

+0

プリミティブの前にラッパーを試してみることもできますあなたが同じことを見ているかどうかを確認してください。私はローグに同意します - あなたがやっているマイクロベンチマークにはいくつかの問題があります。理由の詳細については、https://github.com/google/caliperをご覧ください。 – Snekse

+0

あなたは気になる_why_で質問を更新したいかもしれません。より良い回答が得られるかもしれません。 – Snekse

答えて

7

ここでは本当に間違っています。

まず、良いマイクロベンチマークを書くことは、あなたのコードでやっていることを超えて進みます。いくつかのガイドラインについてはhereを参照してください。

次に、ベンチマークすることを理解する必要があります。申し訳ありませんが、あなたは明らかにしません。ここのように:

public static long wrapper(Integer count) 
{ 
    long startTime = System.currentTimeMillis(); 
    for(int i=0;i<10000;i++) 
    count++ 

Integerオブジェクトは、不変です。このコードはIntegerオブジェクトを「追加」するだけでなく、は、反復ごとに1つの新しいIntegerオブジェクトを作成します()。

もちろん:あなたのコードもを使用しないでください計算結果。 JVM/JITがそれに気付くならば、それは完全にそのループと追加の構造を投げ捨てるかもしれません。だからあなたのメソッドは、countの最終値を返すべきです。呼び出し側はその結果を出力する必要があります。

あなたの特定の質問に答えてください:もちろん、参照型のラッパークラスを使用することは、特定のコストで行われます。あなたのプログラムが(実際に)多くの要素を処理する場合、Integerのリストを使用すると、たとえばintの配列を使用する場合よりもかなり高いコストがになります。あなたが注意を払っておらず、あなたのコードで暗黙的なautoboxing/unboxingを行っているときは、それは本当にhurtです。

しかし、本物の答えは:あなたは間違ったことに集中しています。あなたは、の最初のの優先度は、ののを実行し、十分にテストされ、堅牢で、読みやすく、維持可能な実装が続くことを確認する必要があります。もちろん、あなたはまったくばかげたことやパフォーマンスを無駄にするべきではありませんが、まあ、の前に、あなたはのパフォーマンスについて心配してください。あなたのJava技術全般について心配しないでください。

短いストーリー:Javaを理解することに焦点を当て、「どのように良いデザインを作成するのですか? 「パフォーマンス」については現在を忘れています。アプリケーションでのリアルの問題が発生した場合にのみ、「パフォーマンス」を処理する必要があります。根本的な原因を特定して修正するためには、realのプロファイリングを行います。

+0

貴重な指導をありがとう。私はより多くの私のJavaスキルをブラッシュアップします。 – ShreePool

+0

あなたは大歓迎です。 – GhostCat

関連する問題