java中需要的时间

时间:2010-05-05 09:44:22

标签: java micro-optimization

我想知道单独执行条件循环需要多长时间。 就像我可以选择使用“if else”,“while”,“for”或“foreach”循环那么循环会更快地执行。我知道差异会非常小,大多数人会说它不会但是,如果我有一个可以访问数千个数据的程序,那么这一点就会出现。

我想知道我是否在java的开头声明了一个变量,如果我在使用之前声明它就会有所不同。是否会减少所需的总时间?如果是,则实际使用哪一个(变量在开头被声明的那个或者它们刚被声明为b4的那个被使用)?

8 个答案:

答案 0 :(得分:14)

停止微观优化。

花时间为系统寻找最佳算法,最佳数据结构和最佳设计,并编写最易读的代码。不是这些小事。

答案 1 :(得分:7)

尝试手动优化代码没有太大意义 - JIT编译器可能比你做得好得多。并非最不重要,因为它将在执行时获得有关确切环境的更多信息,而不是编译之前的信息。

此外,由于优化器针对“常见情况”进行了调优,因此对代码引入不常见的优化实际上可能会使JIT编译器的优化程度降低,因此最终会变慢。

尽管如此,如果你仍然 想要衡量某些东西,你可以这样做:

long before = System.currentTimeMillis();
// execute your code e.g. a million times
long after = System.currentTimeMillis();
System.out.println("Execution took " after - before " milliseconds");

答案 2 :(得分:2)

在一般情况下,无法回答,因为Hotspot可能会或可能不会对您的代码进行所有优化。

正如polygenelubricants所说,重要的是编写清晰简洁的代码 - 这不仅会使人们更容易理解(可能是最重要的事情!),但优化编译器“理解”和转向会更容易也是有效的代码。

如果你遇到了性能问题,那么是时候破解一个分析器了,看看你的代码实际上花了多少时间并优化那个部分。同样,这通常涉及改进算法而不是使用略有不同的原语。

答案 3 :(得分:2)

如果它们完全相关,差异将非常小: - )

现在编写清晰,可维护的代码比考虑foreach或while循环之间的差异要重要得多。

javac编译器将优化生成的字节码,因此不应有任何区别。此外,它还使用了哪些算法。

如果你在开头声明你的变量(?什么是“开头”),它可能会影响可见性,但可能不会影响你的应用程序的性能。

无论如何,如果您对此类性能优化感兴趣,请查看Sun的Java VM白皮书:http://java.sun.com/docs/performance/

另外,您可能希望查看“分析”您的Java应用程序,以便您可以自己查看差异。以下是开源Java分析工具列表:http://java-source.net/open-source/profilers

答案 4 :(得分:2)

让我们说清楚。你在这里进行微观优化。这是浪费时间。以下是优化规则:

  1. 不要这样做。
  2. (仅限专家!)不要这样做。
  3. 写入代码以使用好的算法。编写代码要清楚。 检查您是否仍有问题。 测量以找出问题实际存在的位置。只有当你必须时才会优化和。 (并且要注意,在现代计算机上获得良好的时序数据可能非常困难,特别是如果你在内存中有非平凡的其他东西,比如IDE。)

答案 5 :(得分:0)

差异将以微秒为单位,暗示,数千条记录意味着以毫秒为单位的差异。

花点时间思考为什么我首先需要阅读/处理数千条记录?

答案 6 :(得分:0)

我同意@polygenelubricants和@PéterTörök。

出于教育目的,您可以使用javap命令比较不同类型循环的编译代码:

$ javap -v YourClass

答案 7 :(得分:-1)

你为什么不发现自己?写一些带有大循环的smAll程序并进行测量!