Java 性能测量

2022-09-02 19:56:39

我正在我的类之间进行一些Java性能比较,并且想知道是否有某种Java性能框架可以使编写性能测量代码更容易?

也就是说,我现在正在做的是试图衡量与使用AtomicInteger作为我的“同步器”相比,它具有像PseudoRandomUsingSynch.nextInt()那样“同步”的方法有什么效果。

因此,我试图测量使用3个线程访问同步方法循环10000次来生成随机整数所需的时间。

我相信有更好的方法来做到这一点。你能启发我吗?:)

public static void main( String [] args ) throws InterruptedException, ExecutionException {
    PseudoRandomUsingSynch rand1 = new PseudoRandomUsingSynch((int)System.currentTimeMillis());
    int n = 3;
    ExecutorService execService = Executors.newFixedThreadPool(n);

    long timeBefore = System.currentTimeMillis();
    for(int idx=0; idx<100000; ++idx) {
        Future<Integer> future = execService.submit(rand1);
        Future<Integer> future1 = execService.submit(rand1);
        Future<Integer> future2 = execService.submit(rand1);

        int random1 = future.get();
        int random2 = future1.get();
        int random3 = future2.get();

    }
    long timeAfter = System.currentTimeMillis();
    long elapsed = timeAfter - timeBefore;
    out.println("elapsed:" + elapsed);
}

public class PseudoRandomUsingSynch implements Callable<Integer> {
private int seed;

public PseudoRandomUsingSynch(int s) { seed = s; }

public synchronized int nextInt(int n) {
    byte [] s = DonsUtil.intToByteArray(seed);
    SecureRandom secureRandom = new SecureRandom(s);
    return ( secureRandom.nextInt() % n );
}

@Override
public Integer call() throws Exception {
    return nextInt((int)System.currentTimeMillis());
}
}

问候


答案 1

忽略微基准标记在你的情况下是否有用的问题(Stephen C的观点非常有效),我会指出:

首先,不要听那些说“这并不难”的人。是的,使用 JIT 编译在虚拟机上进行微平台标记很困难。实际上,从微型弯台标记中获得有意义和有用的数字真的很难,任何声称这并不难的人要么是超级天才,要么是做错了。:)

其次,是的,周围有一些这样的框架。一个值得一看的(认为它处于非常早期的预发布阶段)是Caliper,由Google的Kevin Bourrillion和Jesse Wilson创作。从早期的几次观察来看,看起来真的令人印象深刻。


答案 2

更多微基准测试建议 - 微观基准很少告诉你你真正需要知道的是什么......这是一个真实应用程序的运行速度。

在你的情况下,我想你正在试图弄清楚你的应用程序使用Atomic对象是否比使用同步对象表现得更好...反之亦然。真正的答案是,它很可能取决于微观基准无法衡量的因素。例如争用概率,保持锁的时间,线程和处理器的数量,以及使原子更新成为可行解决方案所需的额外算法工作量。

编辑 - 回答这个问题。

那么有没有办法测量所有这些争用概率,锁保持持续时间等?

理论上是的。实现整个应用程序后,就可以对其进行检测以测量这些内容。但这也不能给你答案,因为没有一个预测模型可以插入这些数字来给出答案。此外,到那时您已经实现了该应用程序。

但我的观点并不是说,衡量这些因素可以让你预测性能。(它没有!相反,微观基准测试也不允许您预测性能。

实际上,最好的方法是根据您的直觉实现应用程序,然后使用分析作为确定实际性能问题所在的基础。


推荐