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 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
     
    @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
     
    @zbyti - ewentualnie dodaj kilka iteracji rysowania w pętli, aby mieć dokładniejszy wynik na porównanie.
    • 4: CommentAuthorzbyti
    • CommentTime19 Feb 2020 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
     
    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 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
     
    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 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 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 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 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 zmieniony
     
    jeszcze dla porównania szachownica przepisana na CC65:
    Wyszło 26 iteracji, czyli 150/26 = 5,8 średnia.
    • 16: CommentAuthorzbyti
    • CommentTime20 Feb 2020 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 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
     
    @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
     
    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 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
     
    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 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
     
    @tebe - nice!
    • 24: CommentAuthorilmenit
    • CommentTime20 Feb 2020 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 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 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 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 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 zmieniony
     
    SIEVE dla CC65, MP i Action! wrzucę do tabelki za jakiś czas.
    • 30: CommentAuthorantrykot
    • CommentTime20 Feb 2020 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 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 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 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 zmieniony
     
    No ale jak się tak dalej pętle będzie rozwijać to się z Chessboard Bench zrobi YoshPlus ;)
    • 35: CommentAuthorzbyti
    • CommentTime20 Feb 2020 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 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 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
     
    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 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 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 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 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 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 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 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 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 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
     
    #26 yoshplus

    p.s.
    gdzie można obejrzeć te procedury testujące cc65, MEMLO i BASIC ?
    • 49: CommentAuthorilmenit
    • CommentTime21 Feb 2020
     
    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
     
    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?