Re: Java 7 features
Roedy Green <see_website@mindprod.com.invalid> writes:
There are two JVM instructions to implement a switch. Java's N-way
branch. In the JVM there are two different ways of implementing a
switch, tableswitch and lookupswitch. The efficient tableSwitch is a
jump table used when the switch values are reasonably dense e.g.
numbered 0..N. The less efficient lookupSwitch is a binary search used
when the switch values all all over the map. It thus pays to keep your
switch values dense.
Still, they might be implemented by if-sequences.
As Ralf Ullrich recently quoted:
?Figure 5 shows that Java dense switches (tableswitches),
when used to implement dynamic dispatch, result in
performance very similar to that of virtual calls on the
IBM JVM, revealing an implementation based on jump tables.
In the HotSpot Client JVM however, both on Pentium III and
UltraSparc III (gures 7 and 8), tableswitch es behave
exactly like if sequences, which indicates an actual
implementation based on sequences of conditional branches.
Table switches are therefore unreliable in terms of
performance across JVMs.?
The source according to Ralf is:
?Evaluation of Control Structures for Dynamic Dispatch in Java?
http://www.cs.mcgill.ca/research/techreports/reports/01/SOCS.01.13.ps.gz
I just wrote a benchmark, which showed if-sequences to be
actually faster than switches for the special case tested.
import static java.lang.System.nanoTime;
import static java.lang.System.currentTimeMillis;
import static java.lang.System.out;
import static java.lang.System.gc;
import static java.lang.Thread.sleep;
public class Main
{ public static void main( final java.lang.String[] args )
throws java.lang.Throwable
{ int randomizer =( int )( currentTimeMillis() / 947 ); int i1; int i2;
int r0; int r1;
int s;
long d0; long d1; long d2;
long t0, t1, t2, t3, t4, t5;
out.printf
( "Benchmark running - " +
"Please minimize activity of other processes.%n" );
sleep( 3000 );
double a = 0.; double c = 0.;
out.printf
( "The columns" + "%n" +
" Identification number of the outermost iteration" + "%n" +
" Runtime of \"if\" divided by runtime of \"switch\"" + "%n" +
" Average of the preceding column" + "%n" );
for( long l = 0;; ++l )
{ r0 = 0; r1 = 0; s = 0;
d0 = 0; d1 = 0; d2 = 0;
gc();
Thread.sleep( 1000 );
final long n = 100000000L;
{ { t4 = nanoTime();
randomizer +=( int )(( t4 / 7907 )% 611953 );
for( long i = 0; i < n; ++i )
{ randomizer = randomizer * 1103515245 + 12345;
final int random =( randomizer / 65536 )% 10;
s += random; }
t5 = nanoTime();
d2 +=( t5 - t4 ); }
{ t0 = nanoTime();
for( long i = 0; i < n; ++i )
{ randomizer = randomizer * 1103515245 + 12345;
final int random =( randomizer / 65536 )% 10;
{ if( random == 0 )r0 = 20418437;
else if( random == 1 )r0 = 94704581;
else if( random == 2 )r0 = 45898144;
else if( random == 3 )r0 = 49094059;
else if( random == 4 )r0 = 77416885;
else if( random == 5 )r0 = 91322469;
else if( random == 6 )r0 = 40218964;
else if( random == 7 )r0 = 93641667;
else if( random == 8 )r0 = 29822916;
else r0 = 625909; }
s += r0; }
t1 = nanoTime();
d0 +=( t1 - t0 ); }
{ t4 = nanoTime();
for( long i = 0; i < n; ++i )
{ randomizer = randomizer * 1103515245 + 12345;
final int random =( randomizer / 65536 )% 10;
s += random; }
t5 = nanoTime();
d2 +=( t5 - t4 ); }
{ t2 = nanoTime();
for( long i = 0; i < n; ++i )
{ randomizer = randomizer * 1103515245 + 12345;
final int random =( randomizer / 65536 )% 10;
switch( random )
{ case 0: r1 = 16336774; break;
case 1: r1 = 62881795; break;
case 2: r1 = 27998504; break;
case 3: r1 = 9612956; break;
case 4: r1 = 25592297; break;
case 5: r1 = 77114095; break;
case 6: r1 = 23554325; break;
case 7: r1 = 55380051; break;
case 8: r1 = 47971513; break;
default: r1 = 41100793; }
s += r1; }
t3 = nanoTime();
d1 +=( t3 - t2 ); }}
final double q =( d0 - d2 / 2.0 )/( d1 - d2 / 2.0 );
a += q;
out.printf( "%6d; %6.02f; %6.02f%n", l, q, a /( l + 1 ), s ); }}}
/*
Benchmark running - Please minimize activity of other processes.
The columns
Identification number of the outermost iteration
Runtime of "if" divided by runtime of "switch"
Average of the preceding column
0; 0,73; 0,73
1; 0,93; 0,83
2; 0,93; 0,87
3; 0,93; 0,88
4; 0,93; 0,89
5; 0,93; 0,90
6; 0,93; 0,90
*/