私は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
。
上記の方法の計算プロセスで何か間違ったことはありますか?