Forum Życie Wieczne Strona Główna Życie Wieczne

 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Pomiar czasu wykonania poleceń Quick Basic-a

 
Napisz nowy temat   Odpowiedz do tematu    Forum Życie Wieczne Strona Główna -> Offtopic
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






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.
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






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.
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






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.
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






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
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






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)
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






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ęć.
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






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
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Nie 14:03, 24 Sty 2021    Temat postu:

Długość nazwy zmiennych nie ma wpływu na prędkość interpretera
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






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
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Nie 17:11, 24 Sty 2021    Temat postu:

Nie ma znaczenia, czy tablica będzie Integer czy Double
Powrót do góry
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Życie Wieczne Strona Główna -> Offtopic Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach

fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
Regulamin