-7

Java データ型 (byte、short、int、float、double、boolean) では、コンパイルと計算に最も高速なデータ型とその理由を教えてください。理解できるように理由を明確に記載してください。

4

2 に答える 2

7

なぜそれが重要なのですか?速度の問題は、使用しているプリミティブ型に起因するものではなく、時期尚早の最適化は諸悪の根源です。使用しているプリミティブ型がプログラムの速度に影響を与えないことはほぼ保証できます。用途に合わせてタイプを選ぼう!

于 2013-10-03T09:05:19.497 に答える
2

型間の唯一のパフォーマンスの違いは、浮動小数点算術と整数算術での計算です。整数での計算は明らかに測定可能なほど高速です。

経験則 - データが整数として自然に表現できる場合 (たとえば、店舗にあるバナナの数)、整数型 ( byteshortintlong) のいくつかを使用します。データが実数 (購入したバナナのキログラム数) として表されている場合は、 または のいずれかに進みfloatますdouble

すべてのタイプには固有のものがあります。それらの範囲を知る必要があり、何百万ものそれらを割り当てる場合は、それらのメモリ フットプリントを把握する必要があります。


OPのコメントに対処する編集:

整数で計算する方が速い理由を教えてください。

最初に、私が言ったことは理論的に真実ではないことを認めなければなりません。それはすべて、コードを実行するコンピューターのアーキテクチャに依存します。

ただし、一般的に、このステートメントは現在の最新の PC 互換プロセッサにも当てはまります。それはすべて、数値の内部表現 (整数値の場合は2 の補数、浮動小数点数の場合は仮数と指数を検索) と、プロセッサの内部機構、計算ユニット、一部の操作のショートカットに要約されます。少なくともいくつかのクラスのトピックです。

過度の単純化は、浮動小数点数よりもはるかに簡単な方法で格納および処理されるため、整数でカウントする方が簡単であることを示しています。

また、これはプロセッサやアーキテクチャによって異なることを忘れないでください。

結果を示す簡単なテストを作成しました。

private final static int MAX = 1_000_000_000; 

public static void main(String[] args) {
    long time;  // no see

    time = System.currentTimeMillis();
    int intnum = 0;
    for (int i = 0; i < MAX; i++) {
        intnum += i;
    }
    System.out.println("int:\t" + (System.currentTimeMillis() - time));

    time = System.currentTimeMillis();
    long longnum = 0;
    for (int i = 0; i < MAX; i++) {
        longnum += i;
    }
    System.out.println("long:\t" + (System.currentTimeMillis() - time));

    time = System.currentTimeMillis();
    float floatnum = 0;
    for (int i = 0; i < MAX; i++) {
        floatnum += i;
    }
    System.out.println("float:\t" + (System.currentTimeMillis() - time));

    time = System.currentTimeMillis();
    double doublenum = 0;
    for (int i = 0; i < MAX; i++) {
        doublenum += i;
    }
    System.out.println("double:\t" + (System.currentTimeMillis() - time));

    // just to use the values, don't pay attention to the results
    System.out.println();
    System.out.println(intnum);
    System.out.println(longnum);
    System.out.println(floatnum);
    System.out.println(doublenum);
}

私の 32 ビット プロセッサでの結果:

int:    578 ms
long:   1578 ms
float:  3156 ms
double: 3172 ms

このようなベンチマークを正確に行うのは困難ですが(私はあまり試しませんでした)、これは私の実際の経験をかなり正確に表しています。

整数型が最も速く、次にlong、次に浮動小数点型です。

私が 64 ビット プロセッサ、OS、および JVM を使用intしている場合long、おそらく同じレベルになります (私の PCのfloatとのように)。double

于 2013-10-03T09:10:56.347 に答える