Napriklad, aby ste vedeli, ako napisat zakladne veci tak, aby netrvali zbytocne dlhsie, ako by mali. Tu je maly priklad:
Tu su dve, skoro uplne totozne implementacie algoritmu Floyd–Warshall v jave:
class fw1 { public static void main(String args[]) { int i,j,k,N=1000; int [][] pole = new int[N][N]; for(i=0;i<N;i++){ for(j=0;j<N;j++){ pole[i][j]=(i*(N-j))%5000; } } for(i=0;i<N;i++){ for(j=0;j<N;j++){ for(k=0;k<N;k++){ pole[i][j]=Math.min(pole[i][j],pole[i][k]+pole[k][j]); } } } } }
a
class fw2 { public static void main(String args[]) { int i,j,k,N=1000; int [][] pole = new int[N][N]; for(i=0;i<N;i++){ for(j=0;j<N;j++){ pole[i][j]=(i*(N-j))%5000; } } for(k=0;k<N;k++){ for(i=0;i<N;i++){ for(j=0;j<N;j++){ pole[i][j]=Math.min(pole[i][j],pole[i][k]+pole[k][j]); } } } } }
Mozete si vsimnut, ze sa odlisuju len poradim vnorenia cyklov (prvy ma poradie i,j,k a druhy k,i,j). Teraz skuste, bez kompilacie a nasledneho spustenia odhadnut, ako budu na tom casovo tieto dve implementacie.
Vysledok prezradim:
[bwpow@brum ~]$ time java fw1
25.72user 0.00system 0:25.73elapsed 99%CPU (0avgtext+0avgdata 57216maxresident)k
0inputs+64outputs (0major+3851minor)pagefaults 0swaps
[bwpow@brum ~]$ time java fw2
12.78user 0.02system 0:12.81elapsed 99%CPU (0avgtext+0avgdata 57104maxresident)k
0inputs+64outputs (0major+3844minor)pagefaults 0swaps
A teraz skuste nad tym porozmyslat, preco je to tak.