Autor |
Wiadomość |
Piotr-246 |
Wysłany: Nie 17:11, 24 Sty 2021 Temat postu: |
|
Nie ma znaczenia, czy tablica będzie Integer czy Double |
|
|
Piotr-246 |
Wysłany: Nie 17:08, 24 Sty 2021 Temat postu: |
|
Funkcje GET i PUT są bardzo szybkie.
Tablica 100x100 w ciągu 1/3 sekundy potrafi zapełnić Screen 13 dziesięciokrotnie.
Programik:
DEF SEG = 0
SCREEN 13
PRINT "abcdefghiklmnopqrstabcdefghiklmnopqrst"
PRINT "abcdefghiklmnopqrstabcdefghiklmnopqrst"
PRINT "abcdefghiklmnopqrstabcdefghiklmnopqrst"
PRINT "abcdefghiklmnopqrstabcdefghiklmnopqrst"
PRINT "abcdefghiklmnopqrstabcdefghiklmnopqrst"
PRINT "abcdefghiklmnopqrstabcdefghiklmnopqrst"
PRINT "abcdefghiklmnopqrstabcdefghiklmnopqrst"
PRINT "abcdefghiklmnopqrstabcdefghiklmnopqrst"
PRINT "abcdefghiklmnopqrstabcdefghiklmnopqrst"
PRINT "abcdefghiklmnopqrstabcdefghiklmnopqrst"
PRINT "abcdefghiklmnopqrstabcdefghiklmnopqrst"
PRINT "abcdefghiklmnopqrstabcdefghiklmnopqrst"
DIM a(0 TO 1300) AS DOUBLE
GET (0, 0)-(99, 99), a
FOR i = 1 TO 10
t1(i) = PEEK(1132)
PUT (0, 0), a, PSET
PUT (100, 0), a, PSET
PUT (200, 0), a, PSET
PUT (0, 100), a, PSET
PUT (100, 100), a, PSET
PUT (200, 100), a, PSET
t2(i) = PEEK(1132)
NEXT i
LOCATE 1, 1: INPUT b$
LOCATE 2, 1: FOR i = 1 TO 10: PRINT t1(i); t2(i); t2(i) - t1(i): NEXT i |
|
|
Piotr-246 |
Wysłany: Nie 14:03, 24 Sty 2021 Temat postu: |
|
Długość nazwy zmiennych nie ma wpływu na prędkość interpretera |
|
|
Piotr-246 |
Wysłany: Nie 12:14, 10 Sty 2021 Temat postu: |
|
Prędkość funkcji graficznych
Zapełnienie ekranu punktami funkcją PSET z zewnętrznym ustawieniem koloru punktu:
-----------------------------------------------
SCREEN 13
DEF SEG = 0
CLS
COLOR 15
POKE 1132, 0
t0 = PEEK(1132)
FOR x = 0 TO 319 STEP 2
FOR y = 0 TO 239 STEP 2
PSET (x, y)
NEXT y
NEXT x
t1 = PEEK(1132)
PRINT t0; t1, t1 - t0
--------------------------------------------
Liczba cyknięć: 33
Przy wewnętrznym, każdorazowym ustawieniu koloru
PSET (x,y), 15
Liczba cyknięć również: 33 |
|
|
Piotr-246 |
Wysłany: Nie 12:03, 10 Sty 2021 Temat postu: |
|
Komentarz REM umieszczony w pętli również może mieć wpływ na szybkość jej wykonania.
Przy pętli wykonanej 200 tysięcy razy:
- pusta pętla wykonana jest przy 54 cyknięciach komórki 1132
- natomiast komentarz pusty lub zapełniony 70 znakami spowalnia programik do 78 cyknięć. |
|
|
Piotr-246 |
Wysłany: Sob 22:42, 09 Sty 2021 Temat postu: |
|
Stąd wniosek, że warto przygotować ciąg tekstowy przed wejściem do pętli.
Inne oszczędności czasowe uzyskamy zamieniając różne instrukcje na lepsze konstrukcje.
Na przykład:
zamiast sprawdzać za każdym razem wartość zmiennej i:
IF i=1 THEN PRINT "Wiosna"
IF i=2 THEN PRINT "Lato"
IF i=3 THEN PRINT "Jesień"
IF i=4 THEN PRINT "Zima"
... lepiej przygotować przed pętlą
a$(1)= "Wiosna"
a$(2)= "Lato"
a$(3)= "Jesień"
a$(4)= "Zima"
...a w pętli tylko to:
PRINT a$(i) |
|
|
Piotr-246 |
Wysłany: Sob 22:31, 09 Sty 2021 Temat postu: |
|
Dodaję PRINT 0;
-------------------------------------
DEF SEG = 0
CLS
POKE 1132, 0
x0 = PEEK(1132)
FOR i = 1 TO 20000
PRINT 0;
NEXT i
x1 = PEEK(1132)
PRINT x0; x1, x1 - x0
----------------------------------
47 cyknięć czyli prawie dwa razy więcej niż sam średnik
----------------------------------
Inny wariant:
PRINT a
Choć a=0 to jednak druk tego zera zajmuje 61 cyknięć
Druk znaku "0" jako tekstu zajmuje 56 cyknięć
Druk znaku "0 " (ze spacją) zajmuje 58 cyknięć
Druk 10 zer "0000000000" jako tekstu zajmuje 71 cyknięć
ale druk ciągu a$ zawierającego 10 zer a$="0000000000" zajmuje tylko 53 cyknięcia |
|
|
Piotr-246 |
Wysłany: Sob 22:22, 09 Sty 2021 Temat postu: |
|
Teraz zmieniam wielkość pętli do 20 tysięcy
DEF SEG = 0
CLS
POKE 1132, 0
x0 = PEEK(1132)
FOR i = 1 TO 20000
NEXT i
x1 = PEEK(1132)
PRINT x0; x1, x1 - x0
Pusta instrukcja potrzebuje 6 cyknięć
----------------------------------------------------
Dodaję PRINT ; (ze średnikiem czyli "drukuje nic" bez przejścia do następnej linii)
DEF SEG = 0
CLS
POKE 1132, 0
x0 = PEEK(1132)
FOR i = 1 TO 20000
PRINT ;
NEXT i
x1 = PEEK(1132)
PRINT x0; x1, x1 - x0
Program potrzebuje 26 cyknięć czyli ponad 4 razy dłużej niż pusta instrukcja.
------------------------------------------------
kolejny wariant programu:
PRINT bez średnika czyli przejście do nowej inii - czas trwania to 48 cyknięć, czyli prawie dwa razy więcej, niż PRINT ze średnikiem. |
|
|
Piotr-246 |
Wysłany: Sob 22:09, 09 Sty 2021 Temat postu: |
|
Z czego wynika aż tak duża różnica?
Może że sposobu użycia zmiennej.
Jeśli do pustej pętli FOR dopiszemy jakąś inną instrukcje przypisania np: a=0
--------------------------------------------------
DEF SEG = 0
CLS
POKE 1132, 0
x0 = PEEK(1132)
FOR i = 1 TO 200000
a = 0
NEXT i
x1 = PEEK(1132)
PRINT x0; x1, x1 - x0
---------------------------------------------------
...to czas wykonania pętli zwiększy się do 81 cyknięć. Czyli około 2/3 czasu wykonywana jest pętla a 1/3 czasu przypisanie
Jeśli zamiast przypisania damy przyrost a=a+1 liczba cyknięć wzrośnie do 97 czyli znacznie więcej niż samo przypisanie. |
|
|
Piotr-246 |
Wysłany: Sob 22:01, 09 Sty 2021 Temat postu: Pomiar czasu wykonania poleceń Quick Basic-a |
|
Pomiar czasu wykonania poleceń Quick Basic-a
Najpierw puste pętle dla porównania:
DEF SEG = 0
CLS
POKE 1132, 0
x0 = PEEK(1132)
FOR i = 1 TO 200000
NEXT i
x1 = PEEK(1132)
PRINT x0; x1, x1 - x0
POKE 1132, 0
x0 = PEEK(1132)
i = 0
WHILE x < 200000
x = x + 1
WEND
x1 = PEEK(1132)
PRINT x0; x1, x1 - x0
FOR wykonuje w ciągu 54 cyknięć komórki 1132
WHILE w ciągu 136 cyknięć czyli ponad dwa razy dłużej. |
|
|