OldComp.cz
http://oldcomp.cz/

Benchmarking v BASICu
http://oldcomp.cz/viewtopic.php?f=134&t=6590
Stránka 12

Autor:  vaclavpe [ 14.08.2018, 13:34 ]
Předmět příspěvku:  Benchmarking v BASICu

Našel jsem na následujícím odkazu http://www.retroprogramming.com/2010/01/8-bit-home-computer-benchmarks.html zajímavý test pro BASIC, kód je přiložen níž.

Zkusil jsem spustit v BASICu MZ-1Z016 a ten ty výpočty stihl za 180 sekund, což je třetí nejlepší výsledek. Ale BASIC 1-Z013B nefunguje ani zaboha. Buď "Syntax error in 50" nebo overflow na řádku 40 (poté co jsem změnil podmínku za IFem na opačnou a prohodil GOTO 40 s GOTO 20). Rozumíte někdo tomu, proč ten kód v sedmistovkovém BASICu kolabuje ?

Kód:
10 LET W=500:DIM F(W):LET P=1:LET A=3
20 LET F(P)=A:LET P=P+1:IF P>W THEN STOP
30 LET A=A+2:LET X=1
40 LET S=A/F(X):IF S=INT(S) THEN 30
50 LET X=X+1:IF X<P AND F(X)*F(X)<=A THEN 40
60 GOTO 20

Autor:  lukz [ 14.08.2018, 14:00 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

Pro spusteni na MZ-700 je nejlepší pouzit QD Basic MZ-5Z008. Ten rozumi téměř cele syntaxi jako BASIC pro MZ-800. 1Z-013B je vice omezeny, jak je možno videt v uzivatelskem manualu, nezna napr. operator AND.


V MZ-5Z008 (na MZ-800 emulatoru) mi to běželo asi 182 sekund.

Autor:  vaclavpe [ 14.08.2018, 21:14 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

lukz píše:
1Z-013B je vice omezeny, jak je možno videt v uzivatelskem manualu, nezna napr. operator AND.


Aha, tak to je ono, proč to nešlo přeložit. * jako AND nicméně funguje. Proč mi to dávalo chybu na řádku 40, to netuším. Ten 1Z013B je trošku pomalejší, ale jen o 2 sekundy snad.

Ještě jsem zkusil
Kód:
40 LET S=A MOD F(X):IF S=0 THEN 30
ale překvapilo mne, že čas běhu vzrostl o snad 20 sekund.

Autor:  Jiiira [ 16.08.2018, 14:28 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

Nevěděli byste o nějakém podobném benchmarku v assembleru Z80 ?

Autor:  lukz [ 16.08.2018, 17:08 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

Různé BASIC implementace se dají porovnávat benchmarkem, protože všechny dokáží provést stejný program (když se omezíme na velice základní konstrukce), i když jsou příkazy uvnitř implementované jinak. Ale jak by to mělo vypadat s benchmarkem asembleru? Všechny asemblery Z80 přeci vygenerují ten stejný strojový kód.

Autor:  PotPalo [ 16.08.2018, 20:57 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

Benchmark v assembleru. To je otázka. Záleží, ako sa to naprogramuje, či sa bude volať kalkulátor, alebo použijem logické funkcie atď atď. Stačí si len porovnať ako dlho trvá vykreslenie kružnice rôznym programom. Ono nezáleží ČO sa počíta, ale AKO sa to počíta.

Autor:  Jiiira [ 17.08.2018, 08:49 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

lukz píše:
Všechny asemblery Z80 přeci vygenerují ten stejný strojový kód.

Ano, ale o to mi právě jde. Když se vykonává čistě strojový kód, bez volání knihovních funkcí atd., výsledky ukazují na skutečný výpočetní výkon procesoru v dané platformě a budou se pro různé platformy lišit, protože budou ovlivněny těmito faktory:

1) jak hodně je CPU zdržováno jinými obvody, především videočipem (ULA atd.)
2) jaká je pracovní frekvence CPU
3) u klonů a pokračovatelů původní Z80 počet taktů na instrukci, pokud se liší od originálu

Takže benchmark, který by nevolal žádný jiný kód (knihovny, kalkulátor atp.) a pokud možno (ideálně) využíval různé instrukce v takovém poměru, v jakém jsou využívány v běžných programech, by určitě dal zajímavé výsledky...

Autor:  computerasylum [ 17.08.2018, 09:16 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

O tom jsem tu včera psal, ale místní cenzor mi to smáznul. Takže jsem to rozvedl zde
http://www.oldcomp.cz/viewtopic.php?f=70&t=1634&p=81371#p81371
Jde o to, že benchmark má smysl výhradně v assembleru. Určitě ne v Basicu. A k tomu, aby výsledky měly smysl, tedy byly porovnatelné, je potřeba znát přesně, jak benchmark funguje. Jinak se dostanete do situace jako Novinky ve zprávě o tom kolik který stát vydává na dopravní infrakturu
https://www.novinky.cz/zahranicni/evropa/480724-v-italii-spadlo-vice-mostu-za-krize-brutalne-seskrtali-vydaje-na-dopravni-infrastrukturu.html. Což je sice hezké srovnání, ale zapomenulo se na to, že každý stát je jinak velký.
Zpět k benchmarkům. Ty "odněkud" stažené benchmarky, o kterých se neví jak fungují, jsou dobré leda tak na předvádění počítačů. Číselný výsledek je o ničem. Je to stejné, jako s vahou, o které nevíte v jakých jednotkách váží, zda je kalibrovaná nebo není kalibrovaná ...
Benchmark je také takový "měřící" nástroj. Byť ne hardwarový, ale softwarový a proto by mělo být jasné jak funguje a jaké zanáší chyby (tj. to co tu zmínil Jiira přede mnou), tedy čím je benchmark zdržován.

Autor:  Jiiira [ 17.08.2018, 10:44 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

Benchmark v BASICu má taky smysl - jako benchmark toho BASICu (např. když je více BASICů pro stejnou platformu a my je chceme nějak porovnat).

Proto bych basicový benchmark nezatracoval, ale prostě je napřed nutno si ujasnit, co vlastně chceme benchmarkovat. 8-) Dokážu si představit tato využití benchmarku v konkrétním programovacím jazyce (BASIC, C, cokolivjiného...):

1) pro stejnou platformu existuje více interpreterů či překladačů daného jazyka, které chceme porovnat mezi sebou
2) stejný interpreter daného jazyka existuje pro více platforem, porovnáváme z pohledu platformy
3) v případě BASICu můžeme chtít porovnat výkon nativních BASICů (dodávaných s dotyčnou platformou) z pohledu jednotlivých platforem, tedy zjistit, která kombinace HW+BASIC je nejvýkonnější.

Pokud budu chtít opravdu jen změřit výkon CPU (což je můj případ), potřebuju jeden konkrétní stroják spustitelný na všech zkoumaných platformách (zde stroje se Z80) a pak je myslím vhodnější assembler, protože nás odstíní od vlivu různých implementací BASICu apod.

Autor:  faraon [ 19.08.2018, 10:53 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

U méněbitů byl BASIC obvykle neoddělitelná součást počítače, takže se tím testuje nejen samotný hardware, ale stroj jako celek: http://blog.i-logout.cz/retrobenchmarking.php

Program v assembleru má pak smysl jenom na platformách se stejným procesorem, tam bude problém porovnat už jenom 6502 a Z80, a zkoušet totéž s 8080 proti ARMu je prostě nemožné.

Navíc je BASIC hardwarově nezávislý virtuální stroj, takže jednodušší programy jsou z velké části přenositelné. Jinak by se mohly porovnávat leda tak vývojové diagramy, nebo teď módnější kopenogramy.

Autor:  Busy [ 19.08.2018, 11:44 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

computerasylum píše:
Jde o to, že benchmark má smysl výhradně v assembleru. Určitě ne v Basicu.
Rozhodne nesuhlasim ! Benchmark basicu vyznam ma, a velky, a aj sam castokrat rozne bencharky pouzivam, napriklad naposledy ked som testoval ako rychlo bezia spektracke basicove programy na ZX romke preportovanej na PMD85.

Autor:  lukz [ 19.08.2018, 18:21 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

Tak zkusme udělat nějaký Z80 benchmark. Je zde volnost v tom, jak rozhodnout, co je typicky používaný
program. Může to být třeba nějaká hra, která zobrazuje grafické ikony (bitmapy) velikosti 32x32
pixelů. Budeme předpokládat, že kopírování těch bitmap zabere většinu času, a že tedy benchmark bude
napodobovat jen to, a ne nějakou herní logiku. Ještě předpokládáme, že 8 pixelů je uloženo v jednom
byte, že x pozice na obrazovce bude vždy násobek osmi, a že řádka obrazovky má 320 pixelů. Také
předpokládáme, že v grafické paměti jsou pixely uloženy za sebou, odshora dolů, zleva doprava, jako
jedna bitová rovina (kopírování barevného obrázku je potom jako kopírování několika černobílých po
sobě). Všechny tyto předpoklady platí pro Sharp MZ-800.

Funkcionalita rutiny je jako memcpy (kopírování paměti), ale s tím rozdílem, že kopírujeme jeden
souvislý blok do několika nesouvislých.

Program uložíme od adresy 2000h, data bitmapy simulujeme na adrese 2080h, a VRAM je simulovaná na
adrese 2100h. Nezapisujeme tedy skutečně do VRAM, jen do RAM, díky tomu ten benchmark testuje rychlost
samotného CPU, bez ohledu na rychlost VRAM.

Pro spouštění na jiné platformě bude možná potřeba změnit všechny tři adresy, tak aby všechny tři
ležely v oblasti RAM.

Rutina potřebuje celkem asi 183 600 000 cyklů procesoru. To odpovídá časům:
45.9 sec @ 4 Mhz
51.7 sec @ 3.55 Mhz (Sharp MZ-800)

Pro Sharp MZ platí, že ho nic nebrzdí, čas běhu se tedy dá přímo odvodit od kmitočtu hodin procesoru.

Kód v asembleru:
Kód:
; Z80 graphics benchmark
; version 1
; Simulates copying of 32x32 px bitmap from memory to vram
; Repeated 65536 times
; Expected time is 45.9 sec for a Z80 @ 4 MHz

; Change starting address so that it points to a RAM area on your platform

.org 2000h

bitmap .equ 2080h
vram .equ 2100h

  di
  ld bc,0
benchloop:
  push bc

  ld (restore+1),sp
  ld sp,bitmap
  ld hl,vram
  ld bc,37
  ld a,16

copyrow:
  pop de
  ld (hl),e
  inc hl
  ld (hl),d
  inc hl
  pop de
  ld (hl),e
  inc hl
  ld (hl),d
  add hl,bc

  pop de
  ld (hl),e
  inc hl
  ld (hl),d
  inc hl
  pop de
  ld (hl),e
  inc hl
  ld (hl),d
  add hl,bc

  dec a
  jp nz,copyrow

restore:
  ld sp,0

  pop bc
  dec bc
  ld a,b
  or c
  jr nz,benchloop

  ei
  ret

Hex kódy po přeložení (pro naťukání pomocí monitoru):
Kód:
F3 01 00 00 C5 ED 73 2D 20 31 80 20 21 00 21 01
25 00 3E 10 D1 73 23 72 23 D1 73 23 72 09 D1 73
23 72 23 D1 73 23 72 09 3D C2 14 20 31 00 00 C1
0B 78 B1 20 CF FB C9

Autor:  Jiiira [ 20.08.2018, 09:56 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

lukz píše:
Tak zkusme udělat nějaký Z80 benchmark.

Pár dní jsem sem nenahlédl, protože se nikdo neozýval, tak jsem to našel až teď - díky! Při nejbližší příležitosti vyzkouším! :thumbup:

Autor:  faraon [ 05.09.2018, 10:53 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

Trochu jsem zabíjel čas během marodění, tak jsem si nostalgicky hrál s problémem dam na šachovnici. Ono by se to jako benchmark dalo použít také, Didaktik Gama mi 8 dam přežvýkal za 31 minutu, od odentrování osmičky do pípnutí:
Kód:
10 REM N dam na sachovnici
20 INPUT "Pocet dam: ",n:LET d=0:LET k=0:DIM p(n)
100 LET d=d+1:LET p(d)=1
110 FOR i=d-1 TO 1 STEP -1
120     IF p(i)=p(d) OR p(i)+i=p(d)+d OR p(i)-i=p(d)-d THEN GOTO 220
130     NEXT i
140 IF d<n THEN GOTO 100
199 POKE 23692,-1
200 FOR i=1 TO n:PRINT TAB(p(i));"O":NEXT i
210 LET k=k+1:PRINT "kombinace:";k
220 LET p(d)=p(d)+1:IF p(d)<=n THEN GOTO 110
230 LET d=d-1:IF d>0 THEN GOTO 220
300 BEEP .2,2

Řádek 199 způsobí automatické scrollování, mohlo by tam být také PRINT AT 0,0;, ale s tím by program měl být rychlejší, protože se nemusí scrollovat celá obrazovka!
Jinak by v tom nemělo být nic speciálního, takže by to jiné dialekty mohly zbaštit bez úprav, nezkusíte otestovat svoje favority? :speccy:

Zkoušel jsem to i v DOSBoxu, taková středně rychlá 486ka s reálnými proměnnými:
GWBasic: 27 sekund
QBasic: 30 sekund

A s celočíselnými (DEFINT A-Z):
GWBasic: 24 sekundy
QBasic 4 sekundy!

Autor:  Lanex [ 05.09.2018, 13:08 ]
Předmět příspěvku:  Re: Benchmarking v BASICu

lukz píše:
Rutina potřebuje celkem asi 183 600 000 cyklů procesoru. To odpovídá časům:
45.9 sec @ 4 Mhz
51.7 sec @ 3.55 Mhz (Sharp MZ-800)

... se mi to zdálo nějaký pomalý... trochu jsem ti to zoptimalizoval, bez použití SP registru a dělá to nyní za 106 5xx xxx taktů, na 3,54MHz za 30 sekund... ;)

Kód:
   org   32768

bitmap   equ   50000
vram      equ   51000   

   di
   ld   bc,0

benchloop:   exx

   ld   hl,bitmap
   ld   de,vram
   ld   b,0
   ld   a,16

copyrow:   ld   c,40
   ldi
   ldi
   ldi
   ldi
   add   hl,bc

   dec   a
   jp   nz,copyrow

   exx
   dec   bc
   ld   a,b
   or   c
   jp   nz,benchloop

   ei
   ret

Stránka 12 Všechny časy jsou v UTC + 1 hodina [ Letní čas ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/