Java
java8

[Java]型変換速度比較

みなさんもdouble hoge = 1;というコードを見て「double hoge = 1.0d;としなくて大丈夫?」「実行速度が遅くなってしまったりしない?」と心配になった事があるかと思います.
そこで実際に計測してみました.

結果

単位はナノ秒ですが,速度は環境によって変動するのであくまで目安です.
数値が小さいほど相対的に速いと考えて下さい.
太字は同じ型への変換です.

処理 \ 結果(dst)の型 int long float double
dst = int型変数; 19.42 20.93 20.80 20.95
dst = long型変数; 20.92 20.84 20.94
dst = float型変数; 21.10 20.84
dst = double型変数; 20.97
dst = (キャスト)int型変数; 19.95 20.93 20.81 20.95
dst = (キャスト)long型変数; 20.69 21.10 20.96 20.90
dst = (キャスト)float型変数; 21.19 21.11 20.88 21.20
dst = (キャスト)double型変数; 20.97 21.14 20.95 20.95
dst = 1; 20.72 20.86 20.82 21.00
dst = 1l; 20.84 20.75 20.99
dst = 1.0f; 20.72 21.07
dst = 1.0d; 20.94

所感

やはり基本的には型を揃えた方が速いみたいですね.
とはいえ型変換を行う方が速い組み合わせも見受けられるので誤差の範疇と見ていいかもしれません.

double hoge = 1;double hoge = 1.0d;に関してはあまり変わらないと分かったので今日からやっと枕を高くして眠れます.

注意

この結果をもとにした軽率なプログラムの高速化を試みないで下さい.
無理にプログラムを変更し,誤差のような微々たる高速化を行うよりも,可読性やアルゴリズムの高速化の方が重要です.

実行内容

実際に入力した処理内容は以下の通りです.

    static int    srcI = 1;
    static long   srcL = 1l;
    static float  srcF = 1.0f;
    static double srcD = 1.0d;
    static int    dstI;
    static long   dstL;
    static float  dstF;
    static double dstD;
        TimeMeasure.Sample sampleI[] = {
            // そのまま代入
            ()->{ dstI = srcI; }
//        ,   ()->{ dstI = srcL; } // 不可
//        ,   ()->{ dstI = srcF; } // 不可
//        ,   ()->{ dstI = srcD; } // 不可
            // キャストして代入
        ,   ()->{ dstI = (int)srcI; }
        ,   ()->{ dstI = (int)srcL; }
        ,   ()->{ dstI = (int)srcF; }
        ,   ()->{ dstI = (int)srcD; }
            // 数値を代入
        ,   ()->{ dstI = 1   ; }
//        ,   ()->{ dstI = 1l  ; } // 不可
//        ,   ()->{ dstI = 1.0f; } // 不可
//        ,   ()->{ dstI = 1.0d; } // 不可
        };

        TimeMeasure.Sample sampleL[] = {
            // そのまま代入
            ()->{ dstL = srcI; }
        ,   ()->{ dstL = srcL; }
//        ,   ()->{ dstL = srcF; } // 不可
//        ,   ()->{ dstL = srcD; } // 不可
            // キャストして代入
        ,   ()->{ dstL = (long)srcI; }
        ,   ()->{ dstL = (long)srcL; }
        ,   ()->{ dstL = (long)srcF; }
        ,   ()->{ dstL = (long)srcD; }
            // 数値を代入
        ,   ()->{ dstL = 1   ; }
        ,   ()->{ dstL = 1l  ; }
//        ,   ()->{ dstL = 1.0f; } // 不可
//        ,   ()->{ dstL = 1.0d; } // 不可
        };

        TimeMeasure.Sample sampleF[] = {
            // そのまま代入
            ()->{ dstF = srcI; }
        ,   ()->{ dstF = srcL; }
        ,   ()->{ dstF = srcF; }
//        ,   ()->{ dstF = srcD; } // 不可
            // キャストして代入
        ,   ()->{ dstF = (float)srcI; }
        ,   ()->{ dstF = (float)srcL; }
        ,   ()->{ dstF = (float)srcF; }
        ,   ()->{ dstF = (float)srcD; }
            // 数値を代入
        ,   ()->{ dstF = 1   ; }
        ,   ()->{ dstF = 1l  ; }
        ,   ()->{ dstF = 1.0f; }
//        ,   ()->{ dstF = 1.0d; } // 不可
        };

        TimeMeasure.Sample sampleD[] = {
            // そのまま代入
            ()->{ dstD = srcI; }
        ,   ()->{ dstD = srcL; }
        ,   ()->{ dstD = srcF; }
        ,   ()->{ dstD = srcD; }
            // キャストして代入
        ,   ()->{ dstD = (double)srcI; }
        ,   ()->{ dstD = (double)srcL; }
        ,   ()->{ dstD = (double)srcF; }
        ,   ()->{ dstD = (double)srcD; }
            // 数値を代入
        ,   ()->{ dstD = 1   ; }
        ,   ()->{ dstD = 1l  ; }
        ,   ()->{ dstD = 1.0f; }
        ,   ()->{ dstD = 1.0d; }
        };

算出方法

1.計測対象の処理を100万回実行し,1回の平均実行時間を求める.
2. 1を100回実行し,結果の平均値を求める.

※算出部分のプログラムは自家製ライブラリに組み込まれたものを使っているので公開未定です.結果に不信感を持ったら自分で計測してみましょう.


生の実行結果
intへの代入
sample( 1 / 6 )
set times   : 1000000 x 100 
set avelage : 19.416518 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 2 / 6 )
set times   : 1000000 x 100 
set avelage : 19.949821 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 3 / 6 )
set times   : 1000000 x 100 
set avelage : 20.694315 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 4 / 6 )
set times   : 1000000 x 100 
set avelage : 21.191030 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 5 / 6 )
set times   : 1000000 x 100 
set avelage : 20.969548 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 6 / 6 )
set times   : 1000000 x 100 
set avelage : 20.723962 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
longへの代入
sample( 1 / 8 )
set times   : 1000000 x 100 
set avelage : 20.926685 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 2 / 8 )
set times   : 1000000 x 100 
set avelage : 20.923104 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 3 / 8 )
set times   : 1000000 x 100 
set avelage : 20.933459 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 4 / 8 )
set times   : 1000000 x 100 
set avelage : 21.099284 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 5 / 8 )
set times   : 1000000 x 100 
set avelage : 21.107446 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 6 / 8 )
set times   : 1000000 x 100 
set avelage : 21.144695 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 7 / 8 )
set times   : 1000000 x 100 
set avelage : 20.855954 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 8 / 8 )
set times   : 1000000 x 100 
set avelage : 20.842132 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
floatへの代入
sample( 1 / 10 )
set times   : 1000000 x 100 
set avelage : 20.799797 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 2 / 10 )
set times   : 1000000 x 100 
set avelage : 20.841888 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 3 / 10 )
set times   : 1000000 x 100 
set avelage : 21.097959 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 4 / 10 )
set times   : 1000000 x 100 
set avelage : 20.814193 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 5 / 10 )
set times   : 1000000 x 100 
set avelage : 20.959374 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 6 / 10 )
set times   : 1000000 x 100 
set avelage : 20.883601 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 7 / 10 )
set times   : 1000000 x 100 
set avelage : 20.948977 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 8 / 10 )
set times   : 1000000 x 100 
set avelage : 20.824086 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 9 / 10 )
set times   : 1000000 x 100 
set avelage : 20.750565 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 10 / 10 )
set times   : 1000000 x 100 
set avelage : 20.721974 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
doubleへの代入
sample( 1 / 12 )
set times   : 1000000 x 100 
set avelage : 20.958085 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 2 / 12 )
set times   : 1000000 x 100 
set avelage : 20.943837 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 3 / 12 )
set times   : 1000000 x 100 
set avelage : 20.839026 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 4 / 12 )
set times   : 1000000 x 100 
set avelage : 20.972230 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 5 / 12 )
set times   : 1000000 x 100 
set avelage : 20.951048 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 6 / 12 )
set times   : 1000000 x 100 
set avelage : 20.900803 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 7 / 12 )
set times   : 1000000 x 100 
set avelage : 21.196955 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 8 / 12 )
set times   : 1000000 x 100 
set avelage : 20.954024 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 9 / 12 )
set times   : 1000000 x 100 
set avelage : 21.002265 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 10 / 12 )
set times   : 1000000 x 100 
set avelage : 20.991709 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 11 / 12 )
set times   : 1000000 x 100 
set avelage : 21.072246 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|
sample( 12 / 12 )
set times   : 1000000 x 100 
set avelage : 20.941363 ns
|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|=|

環境

Java : 1.8.0_31
OS : Windows 10 64bit
RAM : 32.0GB
CPU : Intel Core i7-4790K 4.00GHz