我想知道单独执行条件循环需要多少时间。就像如果我可以选择使用“if else”、“while”、“for”或“foreach”循环,那么哪个循环会执行得更快。我知道差异会非常小,大多数人会说它不会很重要,但是如果我有一个可以访问数千个数据的程序,那么这一点就会显现出来。
我想知道我是否在java的开头声明了一个变量,如果我在使用它之前声明它会有所不同。所需的总时间会减少吗?如果是,那么实际使用的是哪个(在开始时声明变量或刚刚声明它们的地方 b4 它们被使用)?
我想知道单独执行条件循环需要多少时间。就像如果我可以选择使用“if else”、“while”、“for”或“foreach”循环,那么哪个循环会执行得更快。我知道差异会非常小,大多数人会说它不会很重要,但是如果我有一个可以访问数千个数据的程序,那么这一点就会显现出来。
我想知道我是否在java的开头声明了一个变量,如果我在使用它之前声明它会有所不同。所需的总时间会减少吗?如果是,那么实际使用的是哪个(在开始时声明变量或刚刚声明它们的地方 b4 它们被使用)?
停止微优化。
花时间为您的系统寻找最佳算法、最佳数据结构和最佳设计,并编写最易读的代码。不在这些小事上。
尝试手动优化您的代码没有多大意义——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");
让我们很清楚。你在这里进行微优化。这是浪费时间。以下是优化规则:
编写代码以使用好的算法。把代码写清楚。检查您是否还有问题。测量以找出问题实际存在的位置。仅在那时进行优化,并且仅当您必须. (请注意,在现代计算机上获得良好的时序数据可能非常困难,尤其是如果您在内存中有重要的其他东西,例如 IDE。)
在一般情况下无法回答,因为 Hotspot 可能会或可能不会对您的代码进行所有优化。
正如 polygenelubricants 所说,重要的是编写清晰简洁的代码——这不仅对人类来说更容易理解(可以说是最重要的事情!),而且优化编译器更容易“理解”并转化为高效的代码, 也。
如果您遇到性能问题,那么是时候破解一个分析器,查看您的代码实际花费时间并优化该部分。同样,这通常涉及改进算法,而不是使用稍微不同的原语。
如果它们完全相关,差异将非常小:-)
如今,编写清晰、可维护的代码比考虑 foreach 或 while 循环之间的区别要重要得多。
javac 编译器将优化生成的字节码,因此应该没有任何区别。您使用的算法也非常具体。
如果您在开头声明变量(?什么是“开头”),它可能会影响可见性,但可能不会影响应用程序的性能。
无论如何,如果您对此类性能优化感兴趣,请查看 Sun 的 Java VM 白皮书:http: //java.sun.com/docs/performance/
此外,您可能想看看“分析”您的 java 应用程序,这样您就可以自己看到差异。以下是开源 Java 分析工具的列表:http: //java-source.net/open-source/profilers
差异将以微秒为单位,这意味着,数千条记录意味着以毫秒为单位的差异。
花时间思考为什么我首先需要读取/处理数千条记录?
我同意@polygenelubricants 和@Péter Török。
不过,出于教育目的,您可以使用以下javap
命令比较不同类型循环的编译代码:
$ javap -v YourClass
你为什么不自己去发现?编写一些带有大循环的小程序并进行测量!