Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检测和精确定位性能回归_Java_Performance_Jvm_Regression - Fatal编程技术网

Java 检测和精确定位性能回归

Java 检测和精确定位性能回归,java,performance,jvm,regression,Java,Performance,Jvm,Regression,是否有任何已知技术(以及与之相关的资源,如研究论文或博客条目)描述了如何通过编程动态地检测导致性能下降的代码部分,如果可能,在JVM或其他虚拟机环境中检测(仪器等技术相对容易应用的地方) 特别是,当一个项目有大量的代码库和提交者(例如,一个操作系统、一种语言或一些框架)时,有时很难找出导致性能下降的变化(例如,在某个代码片段中),但不包括如何动态查找项目中因某些提交而更改并导致性能下降的代码片段 我认为这可以通过检测程序的各个部分来检测导致回归的确切方法来实现,或者至少缩小性能回归的可能原因范围

是否有任何已知技术(以及与之相关的资源,如研究论文或博客条目)描述了如何通过编程动态地检测导致性能下降的代码部分,如果可能,在JVM或其他虚拟机环境中检测(仪器等技术相对容易应用的地方)

特别是,当一个项目有大量的代码库和提交者(例如,一个操作系统、一种语言或一些框架)时,有时很难找出导致性能下降的变化(例如,在某个代码片段中),但不包括如何动态查找项目中因某些提交而更改并导致性能下降的代码片段

我认为这可以通过检测程序的各个部分来检测导致回归的确切方法来实现,或者至少缩小性能回归的可能原因范围

有人知道关于这方面的任何文章,或者任何使用这种性能回归检测技术的项目吗

编辑:


我一直在说一些东西,但对代码库本身做了进一步的分析。

使用像YourKit这样的工具,您可以拍摄测试或应用程序的性能崩溃快照。如果您再次运行应用程序,您可以比较性能崩溃以找出差异

性能评测与其说是一门科学,不如说是一门艺术。我不相信你会找到一个工具来准确地告诉你问题是什么,你必须运用你的判断


例如,假设您有一个比以前花费更长时间的方法。这是因为该方法已更改,还是因为它被以不同的方式调用,或者更频繁。您必须使用自己的判断。

JProfiler允许您查看可按平均执行时间排序的插入指令的方法列表ent时间、调用次数等。我认为,如果将这些信息保存在发行版上,可以对回归有一些了解。当然,如果测试不完全相同,分析数据将不准确。

有些人知道一种技术,可以找到(而不是测量)花费过多时间的原因

本质上是这样的:

如果代码很慢,那是因为它花费了一些分数F(比如20%、50%或90%)的时间去做一些不必要的事情,从这个意义上说,如果你知道它是什么,你会把它吹走,并节省那一部分时间

在一般的时间里,它是缓慢的,在任何随机的纳秒,它做X的概率是F

所以,只要拜访它几次,问问它在做什么。 问它为什么这么做

典型的应用程序几乎所有的时间都在等待一些I/O完成,或者一些库函数返回

如果您的程序中有什么东西花费了太多的时间(确实有),那么几乎可以肯定的是,您会在调用堆栈中找到一个或几个函数调用,这些调用是出于糟糕的原因完成的


以下是。

也许不完全符合您的要求,但在我处理的一个具有极端性能要求的项目中,我们使用单元测试框架编写了性能测试,并将它们粘合到我们的持续集成环境中

这意味着每次签入时,我们的CI服务器都会运行测试,以验证我们没有将功能降低到超出可接受范围的程度

它并不完美——但它确实让我们能够随时关注我们的关键性能统计数据,并捕获影响性能的签入

定义“可接受的边界”因为性能与其说是一门科学,不如说是一门艺术——在我们的CI驱动测试中,我们采用了一种基于硬件规范的相当简单的方法;如果性能测试超过100个并发用户的1秒响应时间,我们将无法完成构建。这抓住了一系列低效的性能问题,并给了我们一个不错的解决方案对“生产”硬件的信心水平


我们在签入之前明确没有运行这些测试,因为这会减慢开发周期-强制开发人员在签入之前运行相当长时间的测试会鼓励他们不要太频繁地签入。我们也不相信在不部署到已知硬件的情况下会得到有意义的结果。

谢谢!我同意-这不是很容易准确分析为什么该方法运行得更频繁。我想知道是否有启发式方法至少给出了一个大概的答案。您可以使用该报告来比较更改前后最繁忙的方法。值得检查其中一种增加的方法。谢谢。有趣的是,是否有库支持also、 或者写一篇关于JProfiler是如何做到这一点的文章“一个人可以获得一些洞察力”在我看来,部分是困难的部分。在出现明显的回归之前,人们不会倾向于挖掘这些数据,这让我想将其自动化。可接受的范围是如何定义的?这可以扩展到签入前捕获回归吗?我想,给定DVCS和某种CI系统,您可以在de上运行这些性能检查在开发分支符合合并条件之前,可以在github+travis上为小型开源项目实现这一点。我仍然希望为设置边界和标记错误带来更多的科学。我想每个人都希望在这方面有更多的科学。退后。我要尝试科学!