atarionline.pl Action! (+ benchmarks comparision) - Forum Atarum

    Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

    • :
    • :

    Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

      • 1: CommentAuthorzbyti
      • CommentTime18 Feb 2020 22:02 zmieniony
       
      @tebe zaraz sprawdzę, na razie opuściłem wypełnianie ekranu dla "białego pola" i zszedłem w MP do 7 a dla Action! do 8.

      EDIT:
      @tebe Twoja poprawka zaoszczędziła 1 ticka w starym kodzie, ale, że wrzuciłem już warunek by nie zapełniać komórek ekranu zerami i zszedłem do 7 ticków to ta poprawka już nic mierzalnego nie daje a muszę else dopisywać.

      Wyedytowałem posta z kodem.

      Chociaż skoro miało to mierzyć operacje w obu programach to może mogłem to zostawić? Wtedy MP miało by 9 ticków, ale pewnie w Action zrobił by to samo i zszedł do 10? ;)

      Tak, sprawdziłem, analogiczna poprawka w Action! też oszczędzała tick.
      • 2: CommentAuthorzbyti
      • CommentTime18 Feb 2020 23:02
       
      @Kaz na forum są dwa wątki o identycznym tytule Action!.

      Zmienił byś tytuł tego na Action vs. Reszta Świata albo coś w tym stylu?
      • 3: CommentAuthorilmenit
      • CommentTime19 Feb 2020 00:02
       
      @zbyti - ewentualnie dodaj kilka iteracji rysowania w pętli, aby mieć dokładniejszy wynik na porównanie.
      • 4: CommentAuthorzbyti
      • CommentTime19 Feb 2020 00:02 zmieniony
       
      @ilmenit chodzi o to bym tak jak w jest w sieve puścił rysowanie szachownicy z 10x lub coś w tym stylu? OK jak FORTH ogarnę ;)
      • 5: CommentAuthorzbyti
      • CommentTime19 Feb 2020 01:02
       
      Osobiście polecam przeczytać na start część poświęconą Action! w Jezyki Atari XL XE cz.2, może nie po to by się czegoś nauczyć ale w formie poglądowego repetytorium (jeżeli istnieje takie coś :D).
      • 6: CommentAuthorzbyti
      • CommentTime19 Feb 2020 02:02 zmieniony
       
      Puściłem kod:

      BYTE ch=764     ; ESC = 28

      BYTE RTCLOCK=20 ; sys timer
      CARD SAVMSC=88 ; screen addr

      BYTE col1=709
      BYTE col2=710
      BYTE colB=712

      BYTE stop

      PROC drawBoard()
      BYTE i1b, i2b, i3b, x, color, modLine
      BYTE ARRAY SCREEN

      SCREEN=SAVMSC
      modLine=0

      FOR i3b=1 TO 8
      DO
      FOR i2b=1 TO 24
      DO
      x=0
      FOR i1b=1 TO 8
      DO
      color=0
      IF (i1b & 1) <> modLine THEN color=255 FI
      IF color <> 0 THEN
      SCREEN(x)=color
      SCREEN(x+1)=color
      SCREEN(x+2)=color
      FI
      x==+3
      OD
      SCREEN==+40
      OD
      IF (i3b & 1) = 0 THEN modLine=0
      ELSE modLine=1 FI
      OD
      RETURN

      PROC main()
      BYTE I=[0]

      GRAPHICS(8+16)
      col1=1
      col2=11
      colB=12

      RTCLOCK=0
      WHILE RTCLOCK<150
      DO
      drawBoard()
      I==+1
      OD
      stop=RTCLOCK

      GRAPHICS(0)
      PRINTF("%E %U iterations",I)
      WHILE ch=255 DO OD
      RETURN

      I wyszło 18 iteracji czyli 150/18 = 8,3 średnia na jedną. Biorąc pod uwagę, że na pętlę trochę odchodzi czasu to wygląda, że jeden przebieg który dawał 8 ticks jest miarodajny.
      • 7: CommentAuthortebe
      • CommentTime19 Feb 2020 12:02
       
      cc65 dla pętli WHILE wstawia warunek na koniec pętli, co w większości przypadków przyspiesza pętlę

      okazuje się jednak że nie zawsze
      • 8: CommentAuthorzbyti
      • CommentTime19 Feb 2020 22:02 zmieniony
       
      A czy ktoś miał w ręcach QUICK ->link<- według reklamy wszystkie zalety Action! bez jego wad ;)



      Za $5 można kupić pakiet po ang. ->link<-

      -----------------------------------------

      Szału nie ma, info z podręcznika do wersji 2.0

      But are the quick programs really that fast? We have a small one for that Benchmark test written: With the help of the "Sieve of Eratosthenes" the first should be in 1889 Prime numbers are determined. The corresponding basic program takes 363 seconds for this, while the QUICK program ends after 6 seconds!

      Mad Pascal i CC65 wyrabiały w SIEVE trochę powyżej sekundy a Action! równo dwie. Więc QUICK jest 3x wolniejszy od Action! itd.

      Z rachunku wychodzi, że Action! jest 180x szybszy od BASIC'a :] a CC65 i MP jeszcze raz tyle w szukaniu liczb pierwszych ;)
      • 9: CommentAuthorzbyti
      • CommentTime20 Feb 2020 00:02 zmieniony
       
      Quick 1.6 w teście Yosh wypada 2x wolniej od Action! Podobnie w teście Yosh Plus.

      Mad Pascal         YoshPlus: 35572 iterations in 100 ticks
      Action! YoshPlus: 33239 iterations in 100 ticks
      Quick 1.6 YoshPlus: 16242 iterations in 100 ticks
      Fast Basic 4.0 Int YoshPlus: 1458 iterations in 100 ticks
      fig-Forth 1.1 YoshPlus: 715 iterations in 100 ticks
      CLSN Pascal YoshPlus: 487 iterations in 100 ticks
      • 10: CommentAuthorzbyti
      • CommentTime20 Feb 2020 00:02 zmieniony
       
      @CharlieChaplin can you send me (via PM message) typed version (2.1) from magazine? ->link<-

      I want to try it out before buying.

      If 2.1 runs faster than 1.6 i'll buy english version :]
    1.  
      z ciekawości zakupiłem 2.2 ale jeszcze nie dostałem "zawartości" do pobrania.
      • 12: CommentAuthorzbyti
      • CommentTime20 Feb 2020 01:02 zmieniony
       
      @tooloudtoowide jak otrzymasz i potestujesz dasz znać jakie wrażenia? :]
    2.  
      Jasne, pewnie jutro to prześlą, myślałem, że z automatu to przychodzi, ale nie widzę nic na skrzynce poza potwierdzeniem zapłaty przez Paypala.
    3.  
      dostałem paczkę z archiwum, dzisiaj jak mi praca pozwoli to potestuję. Który kod przerzucić, bo się trochę pogubiłem?
      • 15: CommentAuthorilmenit
      • CommentTime20 Feb 2020 11:02 zmieniony
       
      jeszcze dla porównania szachownica przepisana na CC65:
      Wyszło 26 iteracji, czyli 150/26 = 5,8 średnia.
      • 16: CommentAuthorzbyti
      • CommentTime20 Feb 2020 11:02 zmieniony
       
      @ilmenit dzięki za test, jak na ten moment w każdym teście CC65 o głowę szybszy na mecie :]

      @tooloudtoowide Yosh Plus, Chessboard, Sieve chyba powinieneś mieć gotowy w pakiecie.

      Jak się zapoznasz to powiedz jak oceniasz dołączone materiały (manual w pdf i atr) według opisu to za samą wiedzę o A8 w nich zawartą warto dać $5 ;)
      • 17: CommentAuthorzbyti
      • CommentTime20 Feb 2020 11:02 zmieniony
       
      Kod Chessboard @ilmenit dla wzrokowego porównania z Action! :]

      #include <stdio.h>
      #include <atari.h>
      #include <_atarios.h>

      void draw_board()
      {
      register unsigned char i1b, i2b, i3b, x, modLine;
      register unsigned char *screen = OS.savmsc;
      modLine = 0;

      for (i3b = 1; i3b <= 8; ++i3b)
      {
      for (i2b = 1; i2b <= 24; ++i2b)
      {
      x = 0;
      for (i1b = 1; i1b <= 8; ++i1b)
      {
      if ((i1b & 1) != modLine)
      {
      screen[x] = 255;
      screen[x + 1] = 255;
      screen[x + 2] = 255;
      }
      x += 3;
      }
      screen += 40;
      }
      if ((i3b & 1) == 0)
      modLine = 0;
      else
      modLine = 1;
      }
      }

      void main(void)
      {
      unsigned char stop;
      unsigned char I;

      _graphics(8 + 16);
      OS.color1 = 1;
      OS.color2 = 11;
      OS.color4 = 12;
      OS.rtclok[2] = 0;
      while (OS.rtclok[2] < 150)
      {
      draw_board();
      ++I;
      }
      stop = OS.rtclok[2];
      _graphics(0);
      printf("%u", I);
      infinite:
      goto infinite;
      }
      • 18: CommentAuthorilmenit
      • CommentTime20 Feb 2020 11:02
       
      @zbyti
      Tebe ostro goni CC65 w kolejnych wersjach kompilatora MadPascal, więc można zakładać, że wkróte będzie równie szybki.
      Jeszcze wspomniany przez niego MillFork wygląda bardzo ciekawie i ma nawet przykłady na Atari ->link<-
      • 19: CommentAuthorzbyti
      • CommentTime20 Feb 2020 12:02
       
      Widzę, że opuściłeś jeden warunek, który mi został po poprzednim kodzie. Uwzględnię to dla MP i Action! i zaraz wyniki dorzucę do tabelki.

      Później jeszcze zrobię Yosh Plus w PL65 i dorzucę wynik.
      • 20: CommentAuthorzbyti
      • CommentTime20 Feb 2020 13:02 zmieniony
       
      Mad Pascal     YoshPlus: 35572 iterations in 100 ticks
      Action! YoshPlus: 33239 iterations in 100 ticks
      Quick 1.6 YoshPlus: 16242 iterations in 100 ticks
      Fast Basic FBI YoshPlus: 1458 iterations in 100 ticks
      fig-Forth 1.1 YoshPlus: 715 iterations in 100 ticks
      CLSN Pascal YoshPlus: 487 iterations in 100 ticks

      CC65 Chessboard: 26 iterations in 150 ticks [~5,8]
      Mad Pascal Chessboard: 24 iterations in 150 ticks [6,25]
      Action! Chessboard: 21 iterations in 150 ticks [~7,1]
      • 21: CommentAuthortebe
      • CommentTime20 Feb 2020 14:02
       
      27 iterations skoro upraszczamy (MP 1.4)

      program chessboard;
      uses crt, graph;

      var i, stop : byte;
      rtClock : byte absolute 20;
      col1 : byte absolute 709;
      col2 : byte absolute 710;
      colB : byte absolute 712;
      bmpAdr : word absolute 88;

      procedure drawBoard;
      var i1b, i2b, i3b, x, color, modLine : byte;
      p, p2 : PByte;
      begin

      p := pointer(bmpAdr);
      p2:= p;

      modLine := 0;

      for i3b := 1 to 8 do begin
      for i2b := 1 to 24 do begin
      x := 0;
      for i1b := 1 to 8 do begin

      if i1b and %1 <> modLine then begin

      p2[0]:= 255;
      p2[1]:= 255;
      p2[2]:= 255;

      end;

      inc(p2,3);

      end;
      Inc(p, 40);
      p2:=p;
      end;

      modLine:=ord(i3b and %1 <> 0);

      end;
      end;

      begin
      InitGraph(8 + 16);
      col1 := 1;
      col2 := 11;
      colB := 12;

      pause;
      rtClock := 0;

      while rtClock < 150 do begin
      drawBoard;
      inc(i);
      end;

      stop:=rtClock;

      ReadKey;

      InitGraph(0);
      writeln('Drawing time: ', i);
      ReadKey;
      end.
      • 22: CommentAuthorzbyti
      • CommentTime20 Feb 2020 15:02 zmieniony
       
      @tebe no proszę! Wynik potwierdzony dla Mad Pascal 1.6.4 :D

      No to w szachownicy na prowadzenie wrzucam MP! :D

      Kto da więcej? Nie słyszę? Po raz pierwszy... Po raz... ;)

      Mad Pascal     YoshPlus: 35572 iterations in 100 ticks
      Action! YoshPlus: 33239 iterations in 100 ticks
      Quick 1.6 YoshPlus: 16242 iterations in 100 ticks
      Fast Basic FBI YoshPlus: 1458 iterations in 100 ticks
      fig-Forth 1.1 YoshPlus: 715 iterations in 100 ticks
      CLSN Pascal YoshPlus: 487 iterations in 100 ticks

      Mad Pascal Chessboard: 27 iterations in 150 ticks [5,55]
      CC65 Chessboard: 26 iterations in 150 ticks [~5,8]
      Action! Chessboard: 21 iterations in 150 ticks [~7,1]
      • 23: CommentAuthorilmenit
      • CommentTime20 Feb 2020 15:02
       
      @tebe - nice!
      • 24: CommentAuthorilmenit
      • CommentTime20 Feb 2020 15:02 zmieniony
       
      @zbyti - aktualizuj, przepisałem kod w CC65, aby działał jak ten od Tebe dla MP (na dwóch wskaźnikach). Wynik: 41 iteracji :D
      #include <stdio.h>
      #include <atari.h>
      #include <_atarios.h>

      void draw_board()
      {
      register unsigned char *p = OS.savmsc;
      register unsigned char *p2=p;
      register unsigned char i1b, i2b, i3b, x, modLine;
      modLine = 0;

      for (i3b = 1; i3b <= 8; ++i3b)
      {
      for (i2b = 1; i2b <= 24; ++i2b)
      {
      x = 0;
      for (i1b = 1; i1b <= 8; ++i1b)
      {
      if ((i1b & 1) != modLine)
      {
      p2[0] = 255;
      p2[1] = 255;
      p2[2] = 255;
      }
      p2 += 3;
      }
      p += 40;
      p2 = p;
      }
      modLine = i3b & 1;
      }
      }

      void main(void)
      {
      unsigned char stop;
      unsigned char I=0;

      _graphics(8 + 16);
      OS.color1 = 1;
      OS.color2 = 11;
      OS.color4 = 12;
      OS.rtclok[2] = 0;
      while (OS.rtclok[2] < 150)
      {
      draw_board();
      ++I;
      }
      stop = OS.rtclok[2];
      _graphics(0);
      printf("%u", I);
      infinite:
      goto infinite;
      }
      • 25: CommentAuthorzbyti
      • CommentTime20 Feb 2020 15:02 zmieniony
       
      No i zagarnie va banque ze strony @ilmenit, CC65 znów na prowadzeniu :]

      Mad Pascal     YoshPlus: 35572 iterations in 100 ticks
      Action! YoshPlus: 33239 iterations in 100 ticks
      Quick 1.6 YoshPlus: 16242 iterations in 100 ticks
      Fast Basic FBI YoshPlus: 1458 iterations in 100 ticks
      fig-Forth 1.1 YoshPlus: 715 iterations in 100 ticks
      CLSN Pascal YoshPlus: 487 iterations in 100 ticks

      CC65 Chessboard: 41 iterations in 150 ticks [3,65]
      Mad Pascal Chessboard: 27 iterations in 150 ticks [5,55]
      Action! Chessboard: 21 iterations in 150 ticks [~7,1]
      • 26: CommentAuthorilmenit
      • CommentTime20 Feb 2020 15:02 zmieniony
       
      To jeszcze na prośbę zbytiego YoshPlus - 41844 iteracji
      #include <stdio.h>
      #include <atari.h>

      void main(void)
      {
      register unsigned int i=0;
      register unsigned int a=0;
      register unsigned int b=0;
      OS.rtclok[2] = 0;
      while (OS.rtclok[2] < 100)
      {
      ++a;
      b=a;
      ++b;
      a=b;
      ++i;
      }
      printf("%u", i);
      infinite:
      goto infinite;
      }


      Ja bym proponował też porównanie na SIEVE - to dobry benchmark i bliższy rzeczywistym kodom. W przykładach Madsa jest też o ile pamiętam wersja w ASM, więc można by porównać narzut kompilatorów.
      • 27: CommentAuthorzbyti
      • CommentTime20 Feb 2020 16:02 zmieniony
       
      @ilmenit dzięki, już aktualizuję, wyniki sieve dorzucę.

      A teraz ta sama sztuczka dla Action! Daje tylko jedną iterację więcej.

      BYTE ch=764     ; ESC = 28

      BYTE RTCLOCK=20 ; sys timer
      CARD SAVMSC=88 ; screen addr

      BYTE col1=709
      BYTE col2=710
      BYTE colB=712

      BYTE stop

      PROC drawBoard()
      BYTE i1b, i2b, i3b, modLine
      BYTE ARRAY SCREEN1
      BYTE ARRAY SCREEN2

      SCREEN1=SAVMSC
      SCREEN2=SCREEN1
      modLine=0

      FOR i3b=1 TO 8
      DO
      FOR i2b=1 TO 24
      DO
      FOR i1b=1 TO 8
      DO
      IF (i1b & 1) <> modLine THEN
      SCREEN2(0)=255
      SCREEN2(1)=255
      SCREEN2(2)=255
      FI
      SCREEN2==+3
      OD
      SCREEN1==+40
      SCREEN2=SCREEN1
      OD
      modLine = i3b & 1
      OD
      RETURN

      PROC main()
      BYTE I=[0]

      GRAPHICS(8+16)
      col1=1
      col2=11
      colB=12

      RTCLOCK=0
      WHILE RTCLOCK<150
      DO
      drawBoard()
      I==+1
      OD
      stop=RTCLOCK

      GRAPHICS(0)
      PRINTF("%E %U iterations",I)
      WHILE ch=255 DO OD
      RETURN
      • 28: CommentAuthorzbyti
      • CommentTime20 Feb 2020 16:02 zmieniony
       
      CC65           YoshPlus: 41844 iterations in 100 ticks
      Mad Pascal YoshPlus: 35572 iterations in 100 ticks
      Action! YoshPlus: 33239 iterations in 100 ticks
      Quick 1.6 YoshPlus: 16242 iterations in 100 ticks
      Fast Basic FBI YoshPlus: 1458 iterations in 100 ticks
      fig-Forth 1.1 YoshPlus: 715 iterations in 100 ticks
      CLSN Pascal YoshPlus: 487 iterations in 100 ticks

      CC65 Chessboard: 41 iterations in 150 ticks [3,65]
      Mad Pascal Chessboard: 27 iterations in 150 ticks [5,55]
      Action! Chessboard: 22 iterations in 150 ticks [6,82]
      • 29: CommentAuthorzbyti
      • CommentTime20 Feb 2020 16:02 zmieniony
       
      SIEVE dla CC65, MP i Action! wrzucę do tabelki za jakiś czas.
      • 30: CommentAuthorantrykot
      • CommentTime20 Feb 2020 16:02 zmieniony
       
      void draw_board()
      {
      register unsigned char* p = OS.savmsc;
      register unsigned char i, j, k;
      for (i = 8; i > 0; --i)
      {
      for (j = 24; j > 0; --j)
      {
      for (k = 4; k > 0; --k)
      {
      p[0] = 255;
      p[1] = 255;
      p[2] = 255;
      p += 6;
      }
      p += 16;
      }
      p += i & 1 ? -3 : 3;
      }
      }
      • 31: CommentAuthorzbyti
      • CommentTime20 Feb 2020 17:02 zmieniony
       
      @antrykot nie sprawdzę tego w CC65, za jakiś czas obadam w MP.

      -----------------------

      SIEVE in Action! 10 iterations:

      BYTE ch=764      ; ESC = 28
      BYTE RTCLOCK2=20 ; sys timer
      BYTE RTCLOCK1=19

      CARD COUNT,PRIME, stop

      PROC sieve()
      BYTE ARRAY FLAGS(8190)
      CARD I,K

      PRIME=0
      COUNT=0 ; init count
      FOR I=0 TO 8190 ; and flags
      DO
      FLAGS(I)='T
      OD

      FOR I=0 TO 8190 ; and flags
      DO
      IF FLAGS(I)='T THEN
      PRIME=I+I+3
      K=I+PRIME
      WHILE K<=8190
      DO
      FLAGS(K)='F
      K==+PRIME
      OD
      COUNT==+1
      FI
      OD
      RETURN

      PROC main()
      BYTE I=[0]

      RTCLOCK1=0
      RTCLOCK2=0
      WHILE I<10
      DO
      sieve()
      I==+1
      OD
      stop=RTCLOCK1 * 256 + RTCLOCK2

      PRINTF("%E %U PRIMES IN",COUNT)
      PRINTF("%E %U JIFFIES",stop)
      PRINTF("%E %U iterations",I)

      WHILE ch=255 DO OD
      RETURN
      • 32: CommentAuthorzbyti
      • CommentTime20 Feb 2020 17:02 zmieniony
       
      CC65           YoshPlus: 41844 iterations in 100 ticks
      Mad Pascal YoshPlus: 35572 iterations in 100 ticks
      Action! YoshPlus: 33239 iterations in 100 ticks
      Quick 1.6 YoshPlus: 16242 iterations in 100 ticks
      Fast Basic FBI YoshPlus: 1458 iterations in 100 ticks
      fig-Forth 1.1 YoshPlus: 715 iterations in 100 ticks
      CLSN Pascal YoshPlus: 487 iterations in 100 ticks

      CC65 Chessboard: 41 iterations in 150 ticks [3,65]
      Mad Pascal Chessboard: 27 iterations in 150 ticks [5,55]
      Action! Chessboard: 22 iterations in 150 ticks [6,82]

      CC65 (opt) SIEVE: 602 ticks in 10 iterations
      Mad Pascal (opt) SIEVE: 644 ticks in 10 iterations
      Action! SIEVE: 1003 ticks in 10 iterations
      • 33: CommentAuthorilmenit
      • CommentTime20 Feb 2020 17:02 zmieniony
       
      Wersja Antrykota - 76

      Jakby dalej rozwinąć pętle - 147
      void draw_board()
      {
      register unsigned char *p = OS.savmsc;
      register unsigned char i, j, k;
      for (i = 8; i > 0; --i)
      {
      for (j = 24; j > 0; --j)
      {
      p[0] = 255;
      p[1] = 255;
      p[2] = 255;

      p[0 + 6] = 255;
      p[1 + 6] = 255;
      p[2 + 6] = 255;

      p[0 + 12] = 255;
      p[1 + 12] = 255;
      p[2 + 12] = 255;

      p[0 + 18] = 255;
      p[1 + 18] = 255;
      p[2 + 18] = 255;

      p += 40;
      }
      p += i &1 ? -3 : 3;
      }
      }
      • 34: CommentAuthorzbyti
      • CommentTime20 Feb 2020 17:02 zmieniony
       
      No ale jak się tak dalej pętle będzie rozwijać to się z Chessboard Bench zrobi YoshPlus ;)
      • 35: CommentAuthorzbyti
      • CommentTime20 Feb 2020 18:02 zmieniony
       
      No i kolejne wydanie dla CC65 i MP po innowacji @antrykota. Action! podbiję za chwilę.

      program chessboard;
      uses crt, graph;

      var i, stop : byte;
      rtClock : byte absolute 20;
      col1 : byte absolute 709;
      col2 : byte absolute 710;
      colB : byte absolute 712;
      bmpAdr : word absolute 88;

      procedure drawBoard;
      var i1b, i2b, i3b, color : byte;
      p : PByte;
      begin
      p := pointer(bmpAdr);
      for i3b := 1 to 8 do begin
      for i2b := 1 to 24 do begin
      for i1b := 1 to 4 do begin
      p[0]:= 255;
      p[1]:= 255;
      p[2]:= 255;
      Inc(p,6);
      end;
      Inc(p,16);
      end;
      if (i3b and %1) = 0 then Dec(p,3) else Inc(p,3);
      end;
      end;

      begin
      InitGraph(8 + 16);
      col1 := 1;
      col2 := 11;
      colB := 12;

      pause;
      rtClock := 0;

      while rtClock < 150 do begin
      drawBoard;
      inc(i);
      end;

      stop:=rtClock;

      InitGraph(0);
      writeln('Drawing iterations: ', i);
      ReadKey;
      end.

      CC65           YoshPlus: 41844 iterations in 100 ticks
      Mad Pascal YoshPlus: 35572 iterations in 100 ticks
      Action! YoshPlus: 33239 iterations in 100 ticks
      Quick 1.6 YoshPlus: 16242 iterations in 100 ticks
      Fast Basic FBI YoshPlus: 1458 iterations in 100 ticks
      fig-Forth 1.1 YoshPlus: 715 iterations in 100 ticks
      CLSN Pascal YoshPlus: 487 iterations in 100 ticks

      CC65 Chessboard: 76 iterations in 150 ticks
      Mad Pascal Chessboard: 40 iterations in 150 ticks
      Action! Chessboard: 22 iterations in 150 ticks

      CC65 (opt) SIEVE: 602 ticks in 10 iterations
      Mad Pascal (opt) SIEVE: 644 ticks in 10 iterations
      Action! SIEVE: 1003 ticks in 10 iterations
      • 36: CommentAuthorzbyti
      • CommentTime20 Feb 2020 18:02 zmieniony
       
      No i @antrykot in Action! ;)

      BYTE ch=764     ; ESC = 28

      BYTE RTCLOCK=20 ; sys timer
      CARD SAVMSC=88 ; screen addr

      BYTE col1=709
      BYTE col2=710
      BYTE colB=712

      BYTE stop

      PROC drawBoard()
      BYTE i1b, i2b, i3b
      BYTE ARRAY SCREEN

      SCREEN=SAVMSC

      FOR i3b=1 TO 8
      DO
      FOR i2b=1 TO 24
      DO
      FOR i1b=1 TO 4
      DO
      SCREEN(0)=255
      SCREEN(1)=255
      SCREEN(2)=255
      SCREEN==+6
      OD
      SCREEN==+16
      OD
      IF (i3b & 1) = 0 THEN SCREEN==-3 ELSE SCREEN==+3 FI
      OD
      RETURN

      PROC main()
      BYTE I=[0]

      GRAPHICS(8+16)
      col1=1
      col2=11
      colB=12

      RTCLOCK=0
      WHILE RTCLOCK<150
      DO
      drawBoard()
      I==+1
      OD
      stop=RTCLOCK

      GRAPHICS(0)
      PRINTF("%E %U iterations",I)
      WHILE ch=255 DO OD
      RETURN

      CC65           YoshPlus: 41844 iterations in 100 ticks
      Mad Pascal YoshPlus: 35572 iterations in 100 ticks
      Action! YoshPlus: 33239 iterations in 100 ticks
      Quick 1.6 YoshPlus: 16242 iterations in 100 ticks
      Fast Basic FBI YoshPlus: 1458 iterations in 100 ticks
      fig-Forth 1.1 YoshPlus: 715 iterations in 100 ticks
      CLSN Pascal YoshPlus: 487 iterations in 100 ticks

      CC65 Chessboard: 76 iterations in 150 ticks
      Mad Pascal Chessboard: 40 iterations in 150 ticks
      Action! Chessboard: 35 iterations in 150 ticks

      CC65 (opt) SIEVE: 602 ticks in 10 iterations
      Mad Pascal (opt) SIEVE: 644 ticks in 10 iterations
      Action! SIEVE: 1003 ticks in 10 iterations
      • 37: CommentAuthorzbyti
      • CommentTime20 Feb 2020 21:02 zmieniony
       
      MADS & SIEVE. Ja tu narzutu nie widzę ;)

      Kompilowałem bez, żadnych szczególnych flag:

      mads -x -i: -o:

      Wszystkie programy w tabelce w najnowszych wersjach na 20.02.2020.

      CC65           YoshPlus: 41844 iterations in 100 ticks
      Mad Pascal YoshPlus: 35572 iterations in 100 ticks
      Action! YoshPlus: 33239 iterations in 100 ticks
      Quick 1.6 YoshPlus: 16242 iterations in 100 ticks
      Fast Basic FBI YoshPlus: 1458 iterations in 100 ticks
      fig-Forth 1.1 YoshPlus: 715 iterations in 100 ticks
      CLSN Pascal YoshPlus: 487 iterations in 100 ticks

      CC65 Chessboard: 76 iterations in 150 ticks
      Mad Pascal Chessboard: 40 iterations in 150 ticks
      Action! Chessboard: 35 iterations in 150 ticks

      CC65 (opt) SIEVE: 602 ticks in 10 iterations
      Mad Pascal (opt) SIEVE: 644 ticks in 10 iterations
      MADS (opt) SIEVE: 683 ticks in 10 iterations
      MADS SIEVE: 900 ticks in 10 iterations
      Action! SIEVE: 1003 ticks in 10 iterations
      • 38:
         
        CommentAuthorjhusak
      • CommentTime20 Feb 2020 21:02
       
      Do tych wszystkich testów dobrze byłoby dodać długość binarki, aby było widać, czy szybkość zależy od dł. kodu.

      Bo przyjdzie taki super duper hiper kompilator z optymalizacją i zajmie całą pamięć a wyniki szybkości osiągnie zawrotne...
      • 39: CommentAuthorzbyti
      • CommentTime20 Feb 2020 22:02 zmieniony
       
      Nie było to moim celem jak zaczynałem :] Teraz, jak tabelka urosła, to ma to już sens.

      Coś mi się wydaje, że im większy projekt tym binarki były by do siebie podobne, przy tak krótkim kodzie jak teraz dołączone biblioteki zaciemnią obraz. Jednak niech się wypowiedzą eksperci bo ja jestem lajkonik.

      MP w SIEVE miał wyniki także bez optymalizacji, mogłem dołączyć ale nastawiłem się na szybkość i wypadało by też zamieścić podobne dla CC65 dla najnowszego kompilatora a miałem tylko wyniki z tego forum dla wersji z optymalizacją (jak mi się wydaje).

      @ilmenit jak zechce to uzupełni tabelę o wersję bez "ulepszaczy" dla obu kompilatorów.

      --------------------------------------------------------

      Dla 3-4 najszybszych można wykonać taki test (na wielkość kodu wynikowego) we własnym zakresie.

      Jak kto ciekaw to kod jest zamieszczony :]
      • 40: CommentAuthortebe
      • CommentTime20 Feb 2020 23:02 zmieniony
       
      przykład SIEVE dołączony do Mad Assemblera jest z lat 2015/2016 albo i 2008, jest przykładem praktycznego wykorzystania makro rozkazów #if, #while

      tutaj uwspółcześniony, optymalizowany ASM, 440 ticks
      • 41: CommentAuthorzbyti
      • CommentTime20 Feb 2020 23:02 zmieniony
       
      @tebe dzięki, to podbijam tabelkę.

      CC65           YoshPlus: 41844 iterations in 100 ticks
      Mad Pascal YoshPlus: 35572 iterations in 100 ticks
      Action! YoshPlus: 33239 iterations in 100 ticks
      Quick 1.6 YoshPlus: 16242 iterations in 100 ticks
      Fast Basic FBI YoshPlus: 1458 iterations in 100 ticks
      fig-Forth 1.1 YoshPlus: 715 iterations in 100 ticks
      CLSN Pascal YoshPlus: 487 iterations in 100 ticks

      CC65 Chessboard: 76 iterations in 150 ticks
      Mad Pascal Chessboard: 40 iterations in 150 ticks
      Action! Chessboard: 35 iterations in 150 ticks

      MADS (opt) SIEVE: 440 ticks in 10 iterations
      CC65 (opt) SIEVE: 602 ticks in 10 iterations
      Mad Pascal (opt) SIEVE: 644 ticks in 10 iterations
      Action! SIEVE: 1003 ticks in 10 iterations
      • 42: CommentAuthorzbyti
      • CommentTime20 Feb 2020 23:02 zmieniony
       
      PL65

      Zachęcony poniższymi słowami ze strony ->link<-

      PL65, like the better-known Action, is a high-level ALGOL-derived language intended to produce high-performance code in a more readable format than assembler.

      wklepałem kod SIEVE.
      • 43: CommentAuthorzbyti
      • CommentTime21 Feb 2020 03:02 zmieniony
       
      W załączniku tabelka do uzupełniania / modyfikowania dla chętnych :]

      Dorzuciłem SIEVE w fig-Forth 1.1. Usunąłem DurexForth z C64 bo wynik był niepoprawny a sam program jest niestabilny.

      CC65           YoshPlus: 41844 iterations in 100 ticks
      Mad Pascal YoshPlus: 35572 iterations in 100 ticks
      Action! YoshPlus: 33239 iterations in 100 ticks
      Quick 1.6 YoshPlus: 16242 iterations in 100 ticks
      Fast Basic FBI YoshPlus: 1458 iterations in 100 ticks
      fig-Forth 1.1 YoshPlus: 715 iterations in 100 ticks
      CLSN Pascal YoshPlus: 487 iterations in 100 ticks

      CC65 Chessboard: 76 iterations in 150 ticks
      Mad Pascal Chessboard: 40 iterations in 150 ticks
      Action! Chessboard: 35 iterations in 150 ticks

      MADS (opt) SIEVE: 440 ticks in 10 iterations
      CC65 (opt) SIEVE: 602 ticks in 10 iterations
      Mad Pascal (opt) SIEVE: 644 ticks in 10 iterations
      Action! SIEVE: 1003 ticks in 10 iterations
      PL65 SIEVE: 3853 ticks in 10 iterations
      fig-Forth 1.1 SIEVE: 8482 ticks in 10 iterations
      • 44: CommentAuthorilmenit
      • CommentTime21 Feb 2020 08:02 zmieniony
       
      @jhusak - z tą wielkością binarki to kwestia dyskusyjna.
      Są dwie główne techniki przyspieszania, które zabierają dużo pamięci, czyli lookup tables (np. dla mnożeń lub wskaźników) oraz rozwijanie pętli. O ile wiem żaden z istniejących kompilatorów tego nie robi.
      Trzeba by porównywać wielkość wygenerowanego kodu konkretnej funkcji, bo np. CC65 ma runtime, który jest relatywnie duży (obsługa stosu, operacji 16bit itd.), ale jest dołączany tylko raz. Zatem gdy będzie kod, który wywołuje memset() raz, to będzie on duży, ale w rzeczywistych programach takie wywołanie się robi kilka(naście) razy i każde kolejne to tylko zwiększenie wielkości kodu o odłożenie parametrów na stos i skok. Inny przykład to printf, który w C robi chyba wszystko z wyjątkiem mycia podłogi, a co więcej nie wypisuje danych na ekran, ale na stdio... które można przekierować na inne IO, więc jest tu też warstwa pośrednia. Wielkością tego się nie da porównać ze specjalizowaną funkcją wypisującą wartość do pamięci ekranu istniejącą w innych językach. Ten printf użyłem w przykładach, bo daje krótki i czytelny kod źródłowy i gdyby pisać, aby też kod wynikowy był krótki, to podejście by było inne. Wspomnianego printf nigdy w rzeczywistym programie w CC65 nie użyłem, właśnie ze względu na wielkość.
      Gdy bierze się "czysty kod", to 6502 ma silnie skorelowaną długość generowanego kodu z szybkością jego wykonania.

      Ogólnie, porównanie szybkości jest trudne do zrobienia. Jeżeli jest w kodach użyty inny algorytm, tak porównanie bierze w łeb. Jeżeli jest użyty ten sam, to niektóre działają lepiej w konkretnych językach (np. MillFork, gdzie kod ROMSUM działający "po stronach pamięci" przepisany 1 w 1 do C był bardzo wolny).
      • 45: CommentAuthortebe
      • CommentTime21 Feb 2020 09:02 zmieniony
       
      dlaczego przykładowe programy (nie wszystkie) kompilowane cc65, nie można uruchomić spod DOS-u, pojawia się komunikat o MEMLO, DOS64 ma MEMLO $2000 a i tak nie można uruchomić

      po co ten narzut w kompilowanych cc65?

      Program would load below MEMLO.
      Consider using a higher load address.
      • 46: CommentAuthorilmenit
      • CommentTime21 Feb 2020 09:02 zmieniony
       
      W nowych wersjach kompilatora CC65 w plikach konfiguracyjnych dla Atari jest dodany "system check", dodatkowy segment ładowany opcjonalnie przed załadowaniem głównego programu, który sprawdza czy jest wystarczająco pamięci np. wyłączony BASIC, gdy plik konfiguracyjny używa jego obszaru pamięci. To takie zabezpieczenie, aby dać użytkownikowi informacje zamiast zwisu.

      Można go prosto wyłączyć:
      ->link<-

      Co robi:
      ->link<-

      W Twoim przypadku może nie chodzić o MEMLO, ale MEMTOP - masz wyłączony BASIC?
      • 47: CommentAuthorilmenit
      • CommentTime21 Feb 2020 09:02 zmieniony
       
      Ok, po Twoim edicie widzię, że chodzi o MEMLO. Jaki DOS używasz? Nie wiem niestety, co to DOS64.
      O który też plik testowy chodzi? Jak chessboard, to pewnie dałem tam omyłkowo zbyt niski STARTING_ADDRESS (_graphics chyba alokuje pamięć ekranu poniżej tego).
      ->link<-
      Przyznam, że _graphics() użyłem po raz pierwszy, bo zawsze robiłem swoje DLI.
      • 48: CommentAuthortebe
      • CommentTime21 Feb 2020 10:02
       
      #26 yoshplus

      p.s.
      gdzie można obejrzeć te procedury testujące cc65, MEMLO i BASIC ?
      • 49: CommentAuthorilmenit
      • CommentTime21 Feb 2020 10:02
       
      Dziiiwne, ten yoshplus nie ma nic niestandardowego. Jaki to DOS? Możesz podesłać linka, a też z nim przetestuję.
      Co robi procka testująca: ->link<-
      • 50: CommentAuthorzbyti
      • CommentTime21 Feb 2020 11:02
       
      Ogólnie tylko w chessboard MP znacząco odstaje od CC65. Czy to jest ten przypadek ze stosem gdzie (jak pisał @tebe) CC65 faktycznie jest 100% szybszy od MP?