Názor k článku Výuka programování – nástroje pro ilustraci činnosti mikroprocesoru od Samuel Kupka - Napriklad, aby ste vedeli, ako napisat zakladne veci...

  • Článek je starý, nové názory již nelze přidávat.
  • 30. 11. 2011 1:45

    Samuel Kupka

    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+3851mi­nor)pagefaults 0swaps

    [bwpow@brum ~]$ time java fw2
    12.78user 0.02system 0:12.81elapsed 99%CPU (0avgtext+0avgdata 57104maxresident)k
    0inputs+64outputs (0major+3844mi­nor)pagefaults 0swaps

    A teraz skuste nad tym porozmyslat, preco je to tak.