0

私はシングルトンクラスの2つの実装を持っています

public class Test2 {

private static Test2 _instance=new Test2();

private Test2(){

}

public static synchronized Test2 getInstance(){

    if(_instance == null){          
        _instance = new Test2();
    }
    return _instance;
}
}

と:

public class TestSingleton {

private static TestSingleton _instance=new TestSingleton();

private TestSingleton(){

}

public static TestSingleton getInstance(){
    if (_instance == null) {
        synchronized (TestSingleton.class) {

            if (_instance == null) {
        _instance = new TestSingleton();
            }
        }
    }
    return _instance;
}

かかった時間の観点から私の発見をパラメータ化したいのですが、私がしたことはこれです:

Callable<Long> task = new Callable<Long>() {
        @Override
        public Long call() throws Exception {
            long start = System.nanoTime();
            **TestSingleton.getInstance();**
            long end = System.nanoTime();
            return end - start;
        }
    };

    for (int i = 0; i < 100000; i++) {
        futList.add(es1.submit(task));
    }

    for (Future<Long> fut : futList) {
        try {
            totalTime1.getAndAdd(fut.get());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    System.out.println("Time taken by S1   " + totalTime1.get());
            .
            .
            ExecutorService es2 = Executors.newFixedThreadPool(threadpool);

    Callable<Long> task1 = new Callable<Long>() {
        @Override
        public Long call() throws Exception {
            long start = System.nanoTime();
            Test2.getInstance();
            long end = System.nanoTime();
            return end - start;
        }
    };

    for (int i = 0; i < 100000; i++) {
        futList1.add(es2.submit(task1));
    }

    for (Future<Long> fut : futList1) {
        try {
            totalTime2.getAndAdd(fut.get());
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    System.out.println("Time taken by S2   " + totalTime2.get());

私が得た結果は次のとおりです。

S1 にかかった時間 4636498 S2 にかかった時間 5127865

最初の質問はこれが正しいアプローチですか? getinstances次に、両方でメソッドにコメントを付けてもcall()、2 つの同一ブロックの実行時間が異なります。

S1 にかかった時間 1506640 S2 にかかった時間 2156172

4

1 に答える 1

0

各実行を測定して時間を合計しないでください。個々の測定値が不正確になりすぎます。代わりに、開始時刻を取得し、100000 回実行して、終了時刻を取得します。また、初期費用による偏りを避けるために、測定を開始する前に数千回実行してください。

于 2014-05-08T17:05:47.997 に答える