0

私はMultithreaded program自分のテーブルの1つに挿入するものを持っており、そのプログラムはこのように実行しています-

java -jar CannedTest.jar 100 10000

つまり:

  • スレッド数は100
  • タスク数は10000

したがって、各スレッドが10000 recordsテーブルに挿入されます。したがってtotal count (100 * 10000)、テーブルの意味は、1,000,000プログラムの実行が終了した後でなければなりません。

LnP テストの一環として、テーブルへの挿入にかかる時間を測定しようとしています。ConcurrentHashMap以下のように、データベースへの挿入にかかる時間のように、これらすべての数値を保存しています。

long start = System.nanoTime();

callableStatement[pos].executeUpdate(); // flush the records.

long end = System.nanoTime() - start;

final AtomicLong before = insertHistogram.putIfAbsent(end / 1000000L, new AtomicLong(1L));
if (before != null) {
    before.incrementAndGet();
}

すべてのスレッドがすべてのタスクの実行を終了したら、次のようにConcurrentHashMap insertHistogram 並べ替えて数字を出力しようとするKeyと、以下Millisecondsのような結果が得られます-

Milliseconds           Number
0                      2335
1                      62488
2                      60286
3                      54967
4                      52374
5                      93034
6                      123083
7                      179355
8                      118686
9                      87126
10                     42305
..                      ..
..                      ..
..                      ..

また、同じConcurrentHashMap insertHistogramことから、以下のようなヒストグラムを作成しようとしました。

17:46:06,112  INFO LoadTest:195 - Insert Histogram List:
17:46:06,112  INFO LoadTest:212 - 64823 came back between 1 and 2 ms
17:46:06,112  INFO LoadTest:212 - 115253 came back between 3 and 4 ms
17:46:06,112  INFO LoadTest:212 - 447846 came back between 5 and 8 ms
17:46:06,112  INFO LoadTest:212 - 330533 came back between 9 and 16 ms
17:46:06,112  INFO LoadTest:212 - 29188 came back between 17 and 32 ms
17:46:06,112  INFO LoadTest:212 - 6548 came back between 33 and 64 ms
17:46:06,112  INFO LoadTest:212 - 3821 came back between 65 and 128 ms
17:46:06,113  INFO LoadTest:212 - 1988 came back greater than 128 ms

注:- レコードを挿入しようとしているデータベースは、Memory Only現在モードになっています。

問題文:-

上記の結果でこの番号を見てください。これは、キーでソートして出力します-

0 2335

2335 callsに挿入された可能性があるかどうかはわかりませんか0 milliseconds? またSystem.nanotime、インサートを測定しながら使用しています。

以下は、上記のログを出力するコードです-

private static void logHistogramInfo() {

    int[] definition = { 0, 2, 4, 8, 16, 32, 64, 128 };
    long[] buckets = new long[definition.length];

    System.out.println("Milliseconds           Number");
    SortedSet<Long> keys = new TreeSet<Long>(Task.insertHistogram.keySet());
    for (long key : keys) { 
       AtomicLong value = Task.insertHistogram.get(key);
       System.out.println(key+ "                      " + value);
    }

    LOG.info("Insert Histogram List: ");
    for (Long time : Task.insertHistogram.keySet()) {
        for (int i = definition.length - 1; i >= 0; i--) {
            if (time >= definition[i]) {
                buckets[i] += Task.insertHistogram.get(time).get();
                break;
            }
        }
    }
    for (int i = 0; i < definition.length; i++) {
        String period = "";
        if (i == definition.length - 1) {
            period = "greater than " + definition[i] + " ms";
        } else {
            period = "between " + (definition[i] + 1) + " and " + definition[i + 1] + " ms";
        }
        LOG.info(buckets[i] + " came back " + period);
    }

}

0キーで並べ替えて Map から値を直接出力しようとすると、ミリ秒が表示される理由がわかりません。

しかし、同じ0 millisecondsでヒストグラムを作成しようとすると、同じことが表示されませんlogHistogramInfo method

上記の方法の計算プロセスで何か間違ったことはありますか?

4

0 に答える 0