Java 跨环境精确测量性能测试

Java 跨环境精确测量性能测试,java,performance,environment,automated-tests,Java,Performance,Environment,Automated Tests,我在这个问题上使用Java,但这确实适用于所有现代应用程序开发。我们的“环境管道”与许多管道一样,如下所示: 开发者沙箱 持续集成与测试 质量保证/登台 生产 这些环境中的硬件、可用RAM和CPU各不相同:我的笔记本电脑是2GB双核Windows机器。测试在4GB机器上运行。生产两台(负载平衡)8GB四核服务器 显然,当相同的代码在这些不同的机器(环境)上运行时,其性能会有所不同 我正在考虑为我的一些类编写自动化性能测试,其形式如下: private static final long MA

我在这个问题上使用Java,但这确实适用于所有现代应用程序开发。我们的“环境管道”与许多管道一样,如下所示:

  • 开发者沙箱
  • 持续集成与测试
  • 质量保证/登台
  • 生产
这些环境中的硬件、可用RAM和CPU各不相同:我的笔记本电脑是2GB双核Windows机器。测试在4GB机器上运行。生产两台(负载平衡)8GB四核服务器

显然,当相同的代码在这些不同的机器(环境)上运行时,其性能会有所不同

我正在考虑为我的一些类编写自动化性能测试,其形式如下:

private static final long MAX_TIME = 8000;

@Test
public final void perfTestSomething() {
    long start = System.currentTimeInMillis();

    // Run the test

    long end = System.currentTimeInMillis();

    assertTrue((end - start) < MAX_TIME);
}
private static final long MAX_TIME=8000;
@试验
公共最终void perfTestSomething(){
长启动=System.currentTimeInMillis();
//运行测试
long end=System.currentTimeInMillis();
assertTrue((结束-开始)<最长时间);
}
因此,如果测试运行时间超过(比如)8秒,自动性能测试就会失败

但后来我明白了这一点:代码将在不同的环境中运行,并根据JVM和GC的状态运行。我可以在我自己的机器上运行相同的测试1000次,得到完全不同的结果

所以我问:当代码从一个环境升级到下一个环境时,如何准确/可靠地定义和衡量自动化性能测试

提前谢谢

我可以在我自己的机器上运行相同的测试1000次,得到完全不同的结果

事实上,这不太可能。当然会有一些变化,但是如果机器没有被其他任务重载,那么1000个计时中的大多数都会非常接近

获得一些有意义且稳定的数字的一种方法是多次运行测试,然后查看某些计时(例如中位数、第90百分位、第99百分位等)

如果您的测试单元小于JVM的单个调用(例如,您正在测试单个方法或一组相关方法),则会出现额外的复杂情况。如果是这样的话,我强烈推荐阅读

您可能只希望在一个更严格控制的给定位置运行性能测试。您不一定需要在所有环境中运行它们,这没有什么好处。您应该在最接近生产配置的环境中运行它们(这才是您真正关心的,对吧?)

此外,确保在性能限制方面为自己提供合理的开销。不要将它们锁定在服务器现在所做的事情之上。选择一些合理的阈值来解释当前运行中的一些变化


从长远来看,我发现更有用的是一个性能数据随时间变化的图表。这不是一个严格的限制。通过这种方式,我们可以观察各种功能随时间的变化趋势,并在趋势过高时对其进行攻击。

非常好的建议-感谢aix,我对您的答案投了赞成票,但不得不对rfreak进行绿色检查,因为它更适合我的情况。不过,非常感谢你。