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

标签 java multithreading throughput

我正在对我的一些客户端代码进行基准测试。现在我试图找出如何从我的多线程代码计算吞吐量 -

我正在使用 20 个线程 运行我的程序。每个线程将运行 15 分钟,因此所有 20 个线程将运行 15 分钟

下面是我的代码-

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 方法。

据我了解。总吞吐量将为-

total number of request/ total duration the program was run

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

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

我说得对吗?

最佳答案

只要正确计算(也许使用共享的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));

然后就可以轻松调整线程数和迭代次数来最大化吞吐量。

关于java - 计算多线程代码中的吞吐量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16180385/

相关文章:

java - 参数 13 和 30 的 Pow() 函数失败

multithreading - 为当前调用子程序下的对象提供变量的正确方法?

azure - 写入 Azure Cosmos,吞吐量 RU

amazon-dynamodb - AmazonDB 免费套餐的含义是什么?

java - 如何在另一个自定义 JsonSerializer Jackson 中调用 JsonSerializer

java - 如何设置带有换行符的应用程序名称?

java - org.jvnet.jaxb2.maven2 :maven-jaxb2-plugin : same file , 倍数结果

sql - 锁定选定的行,以便其他事务在读取时忽略它们

multithreading - "benaphores"是否值得在现代操作系统上实现?

language-agnostic - 套接字限制是因为客户端读取数据的速度不够快?