【发布时间】:2017-09-27 16:27:04
【问题描述】:
在我正在工作的 Java 代码的某个部分,我需要在 run() 方法中放置一个计时器。每个线程将执行run() 内的所有代码。但我需要在块 (1) 之后和代码块 (2) 之前开始测量,因此需要在那里触发计时器。
for (int i = 0; i < total_threads-1; i++){
final int id = i+1;
th[i] = new Thread(new Runnable() {
public final void run(){
/* ... block of code (1) executed by multiple threads ... */
/* How can i start this counter only once? */
final long begin = System.currentTimeMillis();
/* ... another block of code (2) executed by multiple threads i need to measure!!! ... */
}
});
th[i].start();
}
for(int i = 0 ; i < total_threads-1 ; i++) {
try {
th[i].join();
}
catch (InterruptedException e) {}
}
final long end = System.currentTimeMillis();
System.out.println((end-begin) / 1000.0);
但是所有线程都有自己的begin 变量并启动计数器,这是一个问题,因为System.currentTimeMillis() 应该被触发一次,而不是由许多线程触发。
我可能可以将run() 的代码分隔在两个不同的并行区域中,但这意味着两次创建线程是不可接受的(就性能而言)。
使用 Java 线程的 Java 是否有类似的 OpenMP 指令 #pragma omp master 技术?
我怎样才能在这里正确测量时间?
【问题讨论】:
-
为每个具有相同值 System.currentTimeMillis 的线程设置单独的 begin 变量有什么意义(如您所愿,它应该只触发一次!)??
标签: java performance openmp hpc performance-measuring