文字列の初期化と処理速度 | sola's note

sola's note

日ごろのメモを書いていきます。何か新しいものを作るために。

設計やってばかりで、全然プログラム触れていない
考えているだけで実態が出来てこないというのはなかなかのストレス。

ということで、ちょっとした疑問を解消するため
ちょっとしたプログラムを。

プログラムを書いている時にたまに気になるのが、
変数の初期化をどのタイミングで行うか。
メモリーの管理方法によって、処理速度が変わるんだと思うけど、
どんな感じで定義すべきなのか。

出来るだけギリギリまで定義しないのか、
使おうと思ったら、定義しちゃうのか。

スコープの問題もあるから、一概には言えないと思うけど、
とりあえず3パターンで実験。

import java.util.Date;

public class TimeCounter {

    public static void main(String[] args) {

        TimeCounter tc = new TimeCounter();

        for (int i = 0; i < 5; i++) {
            System.out.println("----------演算開始----------");
            tc.test001();
            System.out.println("演算終了");
            System.out.println();
            System.out.println();
        }
    }

    private void test001() {
        System.out.println("文字列初期化と負荷テスト開始");
        System.out.println();

        Date btime1 = new Date();
        Date atime1 = new Date();
        Date btime2 = new Date();
        Date atime2 = new Date();
        Date btime3 = new Date();
        Date atime3 = new Date();

        // *********************************************************
        System.out.println("*****nullで初期化の処理開始*****");
        btime1 = new Date();
        for (int i = 0; i < 1000000000; i++) {
            String str = null;
            str = "testtesttesttesttesttesttesttesttesttest";
        }
        atime1 = new Date();
        System.out.println(atime1.getTime() - btime1.getTime());
        System.out.println("nullで初期化の演算終了");
        System.out.println();

        // *********************************************************
        System.out.println("*****空値で初期化の処理開始*****");
        btime2 = new Date();
        for (int i = 0; i < 1000000000; i++) {
            String str = " ";
            str = "testtesttesttesttesttesttesttesttesttest";
        }
        atime2 = new Date();
        System.out.println(atime2.getTime() - btime2.getTime());
        System.out.println("空値で初期化の演算終了");
        System.out.println();

        // *********************************************************
        System.out.println("*****初期化のみ処理開始*****");
        btime3 = new Date();
        for (int i = 0; i < 1000000000; i++) {
            String str = "testtesttesttesttesttesttesttesttesttest";
        }
        atime3 = new Date();
        System.out.println(atime3.getTime() - btime3.getTime());
        System.out.println("初期化無し演算終了");
        System.out.println();

        System.out.println("文字列初期化と負荷テスト終了");
        System.out.println();
    }
}

処理は5回ループしているけど、
5回分の結果書いたら長くなるので、最初の1回で。

----------演算開始----------
文字列初期化と負荷テスト開始

*****nullで初期化の処理開始*****
1234
nullで初期化の演算終了

*****空値で初期化の処理開始*****
1156
空値で初期化の演算終了

*****初期化のみ処理開始*****
1141
初期化無し演算終了

文字列初期化と負荷テスト終了

演算終了

DateのgetTimeはミリセコンドなので、
ざっと、10億回処理しても1秒かそこらな事がわかる。

んで、値の比較なんだけど、
どうやら初期化のタイミングなんて誤差の範囲内らしい。
(少なくとも数10文字の文字列を扱うくらいなら。)