我正在Multithreaded code
努力测量一个特定方法所花费的时间,因为我正在尝试对我们的大多数队友代码进行基准测试,因为我正在Load and Performance
测试我们的Client code
,然后是我们的Service code
.
所以对于这个性能测量,我使用 -
System.nanoTime();
而且我有多线程代码,我从中产生多个线程并试图测量该代码花费了多少时间。
下面是我试图测量任何代码性能的示例示例 - 在下面的代码中我试图测量 -
beClient.getAttributes method
下面是代码-
public class BenchMarkTest {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
try {
for (int i = 0; i < 3 * 5; i++) {
executor.submit(new ThreadTask(i));
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
} catch (InterruptedException e) {
}
}
}
下面是实现 Runnable 接口的类
class ThreadTask implements Runnable {
private int id;
public static ConcurrentHashMap<Long, AtomicLong> selectHistogram = new ConcurrentHashMap<Long, AtomicLong>();
public ThreadTask(int id) {
this.id = id;
}
@Override
public void run() {
long start = System.nanoTime();
attributes = beClient.getAttributes(columnsList);
long end = System.nanoTime() - start;
final AtomicLong before = selectHistogram.putIfAbsent(end / 1000000L, new AtomicLong(1L));
if (before != null) {
before.incrementAndGet();
}
}
}
无论我想测量什么代码,我通常将下面的行放在该方法的正上方
long start = System.nanoTime();
这两行采用相同的方法但不同ConcurrentHashMap
long end = System.nanoTime() - start;
final AtomicLong before = selectHistogram.putIfAbsent(end / 1000000L, new AtomicLong(1L));
if (before != null) {
before.incrementAndGet();
}
今天我和我的一位资深人士开会,他说incrementAndGet
方法ConcurrentHashMap
是阻塞电话。所以你的线程会在那里等待一段时间。
他让我做那个Asynchronous call
。
是否有可能进行该异步调用?
因为在我们所有的客户端代码和服务代码中来衡量每个方法的性能,我使用上面相同的三行,我通常在每个方法之前和之后放置来衡量这些方法的性能。程序完成后,我将这些地图的结果打印出来。
所以现在我正在考虑做那个Asynchronous call
?谁能帮我做到这一点?
基本上,我试图以异步方式测量特定方法的性能,以便每个线程不会等待并被阻塞。
我想,我可以使用Futures
. 任何人都可以提供与此相关的示例吗?
谢谢您的帮助。