我已经开始研究一个项目,在这个项目中,我将传递需要使用多少个线程,然后我将尝试测量SELECT sql
执行所花费的时间,以便我有一个在此行preparedStatement.executeQuery();
之前的计数器和用于衡量此行之后的时间的计数器。
以下是我的代码片段 -
public class TestPool {
public static void main(String[] args) {
final int no_of_threads = 10;
// create thread pool with given size
ExecutorService service = Executors.newFixedThreadPool(no_of_threads);
// queue some tasks
for(int i = 0; i < 3 * no_of_threads; i++) {
service.submit(new ThreadTask());
}
// wait for termination
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
// Now print the select histogram here
System.out.println(ThreadTask.selectHistogram);
}
}
下面是我的ThreadTask类,它实现了Runnable接口 -
class ThreadTask implements Runnable {
private PreparedStatement preparedStatement = null;
private ResultSet rs = null;
public static ConcurrentHashMap<Long, AtomicLong> selectHistogram = new ConcurrentHashMap<Long, AtomicLong>();
public ThreadTask() {
}
@Override
public void run() {
...........
long start = System.nanoTime();
rs = preparedStatement.executeQuery();
long end = System.nanoTime() - start;
final AtomicLong before = selectHistogram.putIfAbsent(end / 1000000L, new AtomicLong(1L));
if (before != null) {
before.incrementAndGet();
}
..............
}
}
问题陈述: -
今天我举行了一次设计会议,其中大多数人说,一旦你运行你的程序,就不会开始测量时间。有一些预热期,然后开始测量它。所以我认为这样做是有道理的。现在我想我应该如何在我的代码中加入这个更改。我将以什么为基础做这件事?有谁能提出建议?
答案 0 :(得分:1)
最简单的预热方法之一是在运行实际(定时)测试之前,在同一个JVM中运行相同的测试,无需计时。您应该运行数千次迭代,以便让JIT有机会识别和优化热点。 How do I write a correct micro-benchmark in Java?的答案中有更多细节(关于这个和你需要考虑的其他事项)
答案 1 :(得分:0)
您可以运行它约15分钟创建新的线程任务。之后,清除selectHistogram重新运行所需的线程数以打印指标。