0

我正在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,并且我使用它来传递给我的getAttributesdao 方法。

所以根据我的理解。总计throughput将是-

total number of request/ total duration the program was run

所以,就我而言,它将是——

total number of id's I have generated/15 minutes

我对吗?

4

2 回答 2

1

只要您正确计算(也许使用共享AtomicInteger?)所有​​由不同线程完成的请求,您所做的一切都很好。

但是,我会稍微切换一下您的代码并提交 100,000 个(或其他)随机 ID,然后计算您的线程处理所有这些 ID 所需的时间。这是一个更现实的测试,因为它会更好地显示您的任务提交开销。

然后你只需输入 astartTimeMillis并计算从结束到开始的差异,然后计算 100,000(或任何你的数字)除以 diff,得到你的平均迭代次数/毫秒。

就像是:

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));

然后很容易使用线程数和迭代次数来最大化您的吞吐量。

于 2013-04-23T23:06:13.840 回答
0

这似乎是正确的,但你怎么数?您可以使用 Callables 而不是 Runnables 来返回生成的 ID 数量。然后你会在关闭 Executor 后得到你所有的 Futures 来总结它。

于 2013-04-23T22:54:52.563 回答