计算多线程代码中的吞吐量

时间:2013-04-23 22:43:14

标签: java multithreading throughput

我正在对我的一些客户端代码进行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

我是对的吗?

2 个答案:

答案 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之后得到你所有的期货来总结它。