我正在对方法的性能进行调查,最终确定开销是由 if else 语句的“else”部分引起的。我编写了一个小程序来说明性能差异,即使代码的 else 部分从未被执行:
public class TestIfPerf
{
public static void main( String[] args )
{
boolean condition = true;
long time = 0L;
int value = 0;
// warm up test
for( int count=0; count<10000000; count++ )
{
if ( condition )
{
value = 1 + 2;
}
else
{
value = 1 + 3;
}
}
// benchmark if condition only
time = System.nanoTime();
for( int count=0; count<10000000; count++ )
{
if ( condition )
{
value = 1 + 2;
}
}
time = System.nanoTime() - time;
System.out.println( "1) performance " + time );
time = System.nanoTime();
// benchmark if else condition
for( int count=0; count<10000000; count++ )
{
if ( condition )
{
value = 1 + 2;
}
else
{
value = 1 + 3;
}
}
time = System.nanoTime() - time;
System.out.println( "2) performance " + time );
}
}
并运行测试程序java -classpath . -Dmx=800m -Dms=800m TestIfPerf
。
我在 Mac 和 Linux Java 上使用 1.6 最新版本执行了此操作。始终如一地,没有 else 的第一个基准测试比有 else 部分的第二个基准测试快得多,即使代码的结构使得 else 部分由于条件而永远不会执行。我知道对某些人来说,差异可能并不显着,但相对性能差异很大。我想知道是否有人对此有任何见解(或者也许我做错了什么)。
Linux 基准测试(纳米)
- 性能 1215488
- 性能 2629531
Mac 基准测试(纳米)
- 性能 1667000
- 性能 4208000