Autor Wiadomość
Piotr-246
PostWysłany: Nie 17:11, 24 Sty 2021    Temat postu:

Nie ma znaczenia, czy tablica będzie Integer czy Double
Piotr-246
PostWysł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
PostWysłany: Nie 14:03, 24 Sty 2021    Temat postu:

Długość nazwy zmiennych nie ma wpływu na prędkość interpretera
Piotr-246
PostWysł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
PostWysł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
PostWysł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
PostWysł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
PostWysł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
PostWysł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
PostWysł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.

Powered by phpBB © 2001, 2005 phpBB Group