7

我这里真是让人头疼。我尝试了一切,到处搜索。它来自我继承的那个测试 JAR 的应用程序。

(它由一个 GUI 前端和一个执行实际检查的命令行应用程序组成。GUI 通过在其自身上启动一个新的 JVM [java -cp "itself.jar" com.different.mainClass] 来运行命令行应用程序。这是一个糟糕的设计,我知道,但可能是相关的。)

无论如何,这个程序包含一些嵌套在两个 for 循环中的反射调用。问题是当应用程序被 JARed 起来时,第一次反射调用每次迭代都需要一秒钟。但是当它从类中运行时,它需要几毫秒。

实际上,这意味着这个命令:

java -jar myjar.jar

需要几个小时。

这个命令:

java -cp "...[bunch of jars];myjar.jar" com.myclasses.main

需要几分钟。

被测试的 JAR 始终是一个 jar。不同之处仅在于测试应用程序。

非常感谢任何想法或追求的途径。谢谢!

4

3 回答 3

1

您可以考虑在诸如 Eclipse TPTPYourKit之类的分析器下运行您的程序,并更准确地确定您的时间都花在了哪里。这很可能会指向您的代码中的错误,或者不太可能指向库中的错误。然后,如果您仍然无法弄清楚,请在此处发布相关代码,我们可以提供帮助。

于 2013-01-29T07:00:46.023 回答
0

正如其他人所提到的,您确实需要分析代码以查看它在哪里花费时间。

如果我不得不猜测,我会怀疑反射工作会导致重复查找类加载器,并且从 jar 文件中提取类时加载它的速度较慢。

但同样,这只是一种预感。您需要对其进行概要分析才能确定。

于 2013-01-29T13:28:22.010 回答
0

我不知道这是否与您的问题有关,但是此命令中的“-cp”参数将被忽略:

$ java -cp "...[bunch of jars]" -jar myjar.jar

“-cp”和“-jar”命令选项不能一起使用。可执行 JAR 文件从 JAR 清单中获取其类路径。

我不明白这如何解释您所看到的症状……但这确实意味着您尝试对可执行 JAR 执行的操作将不起作用,这可能会使您的问题变得毫无意义。


跟进

鉴于这只是问题中的一个错误......不是真正的问题......

我的建议是您使用第二种形式的 java 命令运行测试;即带有-cp选项和类路径。很难看出它会对您的测试制度的有效性产生什么影响。

我怀疑确定性能问题的根本原因需要详细检查测试器应用程序正在做什么。

于 2013-01-29T03:06:42.853 回答