我正在对我的一些客户端代码进行bench marking
。现在我试图找出如何从我的Multithreading
代码 -
我正在使用20 threads
运行我的程序。并且每个线程将运行15 minutes
,所以20 threads will run for 15 minutes
。
以下是我的代码 -
public static void main(String[] args) {
try {
// create thread pool with given size
ExecutorService service = Executors.newFixedThreadPool(20);
// queue some tasks
long startTime = System.currentTimeMillis();
long endTime = startTime + (15 * 60 * 1000);
for (int i = 0; i < 20; i++) {
service.submit(new CassandraReadTask(endTime, columnFamilyList));
}
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
} catch (Exception e) {
LOG.warn("Threw a Exception in" + CNAME + e);
}
}
以下是我的实现Runnable interface
-
class CassandraReadTask implements Runnable {
public void run() {
try {
while (System.currentTimeMillis() <= endTime) {
double randomNumber = random.nextDouble() * 100.0;
final String id = generateRandomId(random);
ICassandraClientDao clientDao = ClientFactory.getInstance().getDao(clientName);
clientDao.getAttributes(id, columnsList, columnFamily);
}
} catch (Exception e) {
}
}
}
从上面的代码中,我生成了一些随机ID和id,我正在使用它来传递给我的getAttributes
dao方法。
所以从我的理解。总计throughput
将是 -
total number of request/ total duration the program was run
所以,就我而言,它将是 -
total number of id's I have generated/15 minutes
我是对的吗?
答案 0 :(得分:1)
只要您正确计算(可能使用共享AtomicInteger
?)不同线程完成的所有请求,您做得很好。
但是,我会稍微切换你的代码并提交100,000(或其他)随机ID,然后计算你的线程处理所有这些id需要多长时间。这是一个更现实的测试,因为它会更好地显示您的任务提交开销。
然后你只需要startTimeMillis
并计算从结束到开始的差异,然后计算100,000(或你的数字除以)除以差异,得到你的平均迭代/毫秒。
类似的东西:
long startTimeMillis = System.currentTimeMillis();
int numIterations = 100000;
for (int i = 0; i < numIterations; i++) {
double randomNumber = random.nextDouble() * 100.0;
final String id = generateRandomId(random);
service.submit(new CassandraReadTask(id, columnFamilyList));
}
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
long diff = System.currentTimeMillis() - startTimeMillis;
System.out.println("Average time per iteration is " + (numIterations / diff));
然后,可以轻松使用线程数和迭代次数来最大化吞吐量。
答案 1 :(得分:0)
这似乎是正确的,但你怎么算?您可以使用Callables而不是Runnables来返回生成的ID的数量。然后你会在关闭Executor之后得到你所有的期货来总结它。