Java 是否有任何单独的剖面测试应用技术?
我在评测方面是个笨蛋,请告诉我你们是如何评测你们的应用程序的。哪一个更好,分析整个应用程序还是进行隔离?如果选择隔离,你是怎么做的 尽可能地查看一下,分析整个应用程序,运行真实(典型)的工作负载。如果你做了任何其他事情,那么你就有可能得到导致你把优化工作的重点放在错误的地方的结果 编辑 在分析整个应用程序时,要获得正确的结果不是太难了吗?所以测试结果取决于用户交互(按钮点击等),而不是使用自动任务?如果我错了,告诉我 获得“正确结果”取决于您如何解释分析数据。例如,如果您正在评测一个交互式应用程序,您应该找出该概要文件的哪些部分对应于等待用户交互,并忽略它们 在部分分析应用程序时存在许多问题。例如:Java 是否有任何单独的剖面测试应用技术?,java,.net,ruby,testing,profiling,Java,.net,Ruby,Testing,Profiling,我在评测方面是个笨蛋,请告诉我你们是如何评测你们的应用程序的。哪一个更好,分析整个应用程序还是进行隔离?如果选择隔离,你是怎么做的 尽可能地查看一下,分析整个应用程序,运行真实(典型)的工作负载。如果你做了任何其他事情,那么你就有可能得到导致你把优化工作的重点放在错误的地方的结果 编辑 在分析整个应用程序时,要获得正确的结果不是太难了吗?所以测试结果取决于用户交互(按钮点击等),而不是使用自动任务?如果我错了,告诉我 获得“正确结果”取决于您如何解释分析数据。例如,如果您正在评测一个交互式应用程
- 通过预先决定要分析应用程序的哪些部分,您无法很好地了解不同部分的相对贡献,并且可能会在错误的部分上浪费精力
- 您几乎必须使用人工工作负载。无论何时这样做,都存在工作负载不代表“正常”工作负载的风险,并且您的分析结果是有偏差的
- 在许多应用程序中,瓶颈是由于应用程序的各个部分彼此交互的方式,或者与I/O或垃圾收集交互的方式造成的。单独分析应用程序的不同部分可能会错过这些交互
(是的……我有点含糊其辞。但我的观点是,做这件事没有神奇的公式。最终,你必须使用你的大脑……就像调试一个复杂的应用程序一样。)首先,我只是用手表计时,以获得一个整体测量值 然后,我在调试器下运行它,并获取。它们所做的是告诉我哪些代码行占用了大部分时间。特别是,这意味着在不需要调用函数的情况下调用函数的行,以及我可能不知道的I/O 因为它向我展示了代码行,这些代码需要时间,而且可以用更好的方式完成,所以我修复了这些代码行 然后我从头开始,看看我到底节省了多少时间。我重复这些步骤,直到我再也找不到a)花费大量时间的事情,以及b)我可以修复的事情 这被称为“穷人的貌相”。这个小秘密不仅在于它便宜,而且非常有效,因为它避免了麻烦 另外,如果它是一个交互式应用程序,只需对它的慢部分执行所有这些操作,就像你按下“做有用的事情”按钮,几秒钟后它就会完成。当它等着你的时候,拍斯塔克镜头是没有意义的
p.p.S.假设有一些活动应该更快,但完成得太快而无法进行堆叠拍摄,比如需要一秒钟,但应该需要几分之一秒。然后,您可以(暂时)在其周围环绕一个for循环,循环次数为10或100次。这就需要足够长的时间来获取样本。加速后,删除循环。我的意思是,每个类模块等都是单独测试的,彼此不认识(抱歉,可能不是一个正确的词来表示)。感谢快速回答,但在分析整个应用程序时,要获得正确的结果不是太难了吗?所以测试结果取决于用户交互(按钮点击等),而不是使用自动任务?告诉我我是否错了。@bonjomo:Stephen完全正确。如果你专注于一个特定的模块,那么你实际上是在进行预先判断,当你做这项工作时,你学到的第一件事是,问题并不是你可能猜到的地方。如果你从整体上分析问题,那么问题就会告诉你它们在哪里。不需要猜测。我非常同意你的观点,直到最后一段:-)我不关心“热点”的概念,也不关心“深入”的方法,但我怀疑当我们开始讨论实质问题时,我们说的是同一件事。你可能不需要,因为你可能有丰富的经验和直觉。我发现,尽管我有经验和直觉,但我可以写一些似乎表现不错的东西,同时还有很大的加速空间。然而,找到要优化的代码并不需要直觉。它只需要堆叠快照。有些问题需要直觉,但性能不是其中之一:谢谢,但我要找的是技术。链接+1,这些链接的答案+10,谢谢。我以为你写这篇文章是为了反驳我对Stephen C答案的评论,所以它有点偏离了最初的答案。这是伟大的,但我应该选择斯蒂芬作为接受Answer@bonjorno:谢谢。对斯蒂芬说得很好。你点击了我的“常规按钮”,性能调整不需要是一个侦探工作的过程,而更像是修剪一棵树,调用树。这不是一般人都知道的,所以我倾向于对它吹毛求疵。