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 

Kompilator QuickBasic
Idź do strony 1, 2  Następny
 
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: Wto 20:37, 26 Sty 2021    Temat postu: Kompilator QuickBasic

[b]Kompilator QuickBasic[/b]


Pusta instrukcja wykonana 100 tysięcy razy przez Interpreter: 24 tyknięcia zegara
Po kompilacji: 21 tyknięć

start:
DEF SEG = 0
t1 = PEEK(1132)
FOR i = 1 TO 100000: NEXT i
t2 = PEEK(1132)
PRINT t1; t2; t2 - t1
PRINT
PRINT
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Wto 20:48, 26 Sty 2021    Temat postu:

Tym razem prędkość funkcji sinus.
Przy 100 tysiącach odczytów

Interpreter: 124 tyknięcia
Po kompilacji: 100 tyknięć

start:
DEF SEG = 0
t1 = PEEK(1132)
FOR i = 1 TO 100000
s = SIN(3.14159)
NEXT i
t2 = PEEK(1132)
PRINT t1; t2; t2 - t1
PRINT
PRINT
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Wto 20:59, 26 Sty 2021    Temat postu:

Dodawanie:

Interpreter 41 tyknięć
Po kompilacji 26 tyknięć


start:
DEF SEG = 0
t1 = PEEK(1132)
FOR i = 1 TO 100000
s = SIN(3.14159)
NEXT i
t2 = PEEK(1132)
PRINT t1; t2; t2 - t1
PRINT
PRINT

Przy czym próba z 10 cyframi o przecinku daje takie same rezultaty. Zarówno w interpreterze jak po kompilacji.
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Wto 21:01, 26 Sty 2021    Temat postu:

Poprawka. Jeszcze raz, właściwy kod:

Interpreter 41 tyknięć
Po kompilacji 26 tyknięć

Przy czym próba z 10 cyframi o przecinku daje takie same rezultaty. Zarówno w interpreterze jak po kompilacji.

start:
DEF SEG = 0
t1 = PEEK(1132)
FOR i = 1 TO 100000
a = 1.013456789# + 2.0123456789#
NEXT i
t2 = PEEK(1132)
PRINT t1; t2; t2 - t1
PRINT
PRINT
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Wto 21:35, 26 Sty 2021    Temat postu:

Potęgowanie - tu duża różnica
Liczba podniesiona do kwadratu:

Interprete:

142 tykniecia zegara gdy potęga jest oznaczona znakiem ^2
41 tyknięć, gdy jest rozpisana na mnożenie jak poniżej:

Po kompilacji:

113 gdy operacja oznaczona jest znakiem ^2
26 tyknięć - liczba rozpisana na mnożenie


start:
DEF SEG = 0
t1 = PEEK(1132)
FOR i = 1 TO 100000
a = 1.013456 * 1.013456
NEXT i
t2 = PEEK(1132)
PRINT t1; t2; t2 - t1
PRINT
PRINT

REM 142 ,41
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Wto 21:36, 26 Sty 2021    Temat postu:

Na tym przykładzie widać, co znaczy optymalizacja programu. Więcej osiągnie się dzięki odpowiedniej wiedzy, niż samym tylko użyciu kompilatora.
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Śro 12:50, 27 Sty 2021    Temat postu:

Podsumowanie - według jednorazowego czasu wykonania polecenia:

Pusta petla:

I: 0.00024 cyknięć
K: 0.00021 cyknięć (można przyjąć jako jednostkę, choć nie mam pewności czy to jest taka sama jednostka co maszynowa instrukcja NOP - No Operation)


Odczyt s=sin(3.14159):

I: 0.00124 cyknięć (5.9 jednostek)
K: 0.00100 cyknięć (4.77 jednostek)


Dodawanie a = 1.013456789# + 2.0123456789#

I: 0.00041 cyknięć (1.96 jednostek)
K: 0.00026 cyknięć (1.24 jednostek)

(Przy czym próba z różną ilością cyfr po przecinku daje takie same rezultaty)


Potęgowanie. Liczba podniesiona do kwadratu:

I: 0.00142 cyknieć (6.76 jednostek) gdy operacja jest oznaczona znakiem ^2
I: 0.00041 cyknięć (1.96 jednostek) gdy operacja jest rozpisana na mnożenie
K: 0.00113 cyknięć (5.38 jednostek) gdy operacja jest oznaczona jest znakiem ^2
K: 0.00026 cyknięć (1.24 jednostek) gdy oprecaja jest rozpisana na mnożenie
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Czw 7:40, 28 Sty 2021    Temat postu:

Odczyt z tablicy liczbowej 100000 razy


I: 63 cyknięcia - gdy zmienna b nie jest typu Integer
I: 52 cyknięcia - gdy zmienna b jest typu Integer
K: 35 cyknięcia - gdy zmienna b nie jest typu Integer
K: 23 cyknięcia - gdy zmienna b jest typu Integer


DEF SEG = 0
DIM a(0 TO 1000) AS INTEGER

FOR i = 0 TO 1000
a(i) = 65
NEXT i

t1 = PEEK(1132)
FOR i = 1 TO 100000
b% = a(700)
NEXT i
t2 = PEEK(1132)

PRINT
PRINT t1, t2, t2 - t1
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Czw 7:53, 28 Sty 2021    Temat postu:

Odczyt z tablicy znakowej 100000 razy:


I: 184 cyknięć gdy zmienna b nie jest zadeklarowana jako ciąg jednoznakowy
I: 195 cyknięć gdy zmienna b jest zadeklarowana jako ciąg jednoznakowy
K: 130 cyknięć gdy zmienna b nie jest zadeklarowana jako ciąg jednoznakowy
K: 42 cyknięć gdy zmienna b jest zadeklarowana jako ciąg jednoznakowy

DEF SEG = 0
DIM a(0 TO 1000) AS STRING * 1
DIM B AS STRING * 1

FOR i = 0 TO 1000
a(i) = "A"
NEXT i

t1 = PEEK(1132)
FOR i = 1 TO 100000
B = a(700)
NEXT i
t2 = PEEK(1132)

PRINT
PRINT t1, t2, t2 - t1
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Czw 11:24, 28 Sty 2021    Temat postu:

Podsumowanie dwóch ostatnich postów. Przeliczenie dla pojedynczej próby:


Odczyt z tablicy liczbowej a typu Integer do zmiennej b:

I: 0.00063 cyknięcia (3 jednostki) - do zmiennej b, która nie jest typu Integer.
I: 0.00052 cyknięcia (2.48 jednostki) - do zmiennej b, która jest typu Integer.
K: 0.00035 cyknięcia (1.67 jednostki) - do zmiennej b, która nie jest typu Integer.
K: 0.00023 cyknięcia (1.1 jednostki) - do zmiennej b, która jest typu Integer.

Odczyt z tablicy znakowej a (jednoznakowej) do zmiennej b:


I: 0.00184 cyknięcia (8.76 jednostki), gdy zmienna b nie jest zadeklarowana jako ciąg jednoznakowy
I: 0.00195 cyknięcia (9.29 jednostki), gdy zmienna b jest zadeklarowana jako ciąg jednoznakowy
K: 0.00130 cyknięcia (6.19 jednostki), gdy zmienna b nie jest zadeklarowana jako ciąg jednoznakowy
K: 0.00042 cyknięcia (2 jednostki), gdy zmienna b jest zadeklarowana jako ciąg jednoznakowy


(przy 0.00021 cyknięcia przyjętego jako jednostka)
Uwaga. Podane wyniki mogą zależeć od parametrów procesora, wersji programu lub innych czynników. Eksperymenty mają pokazać proporcje czasu.
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Czw 12:24, 28 Sty 2021    Temat postu:

Dla ścisłości, potrzeba wrócić do pętli pustej.

Pętla pusta FOR nie jest maszynowym poleceniem NOP (No Operation), gdyż musi składać się z co najmniej kilku poleceń języka maszynowego:

W Atari było to coś takiego:

start: LDA 0 - zmienna A (tzw akumulator) przyjmuje wartość 0
powtorz: ??? - jakieś polecenie zwiększające A o 1
??? - jakieś polecenie sprawdzające czy np. A=100
??? - skok warunkowy n bajtów do tyłu, gdy A<100, do miejsca "powtorz"
reszta: ??? - pierwsza instrukcja po wyjściu z pętli

Oczywiście A przyjmuje wartości w przedziale od 0 do 255. Skok warunkowy też jest o najwyżej 255 bajtów do przodu lub do tyłu. itd.

Tak więc, pętla pusta FOR wykonana 100 tysięcy razy musi zaangażować dużo większy licznik niż jednobajtowy 0-255.
To oznacza, że nie jest wtedy najmniejszą, elementarną pętlą pustą.
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Czw 12:52, 28 Sty 2021    Temat postu:

Rozpisując pętle pustą na dwie pętle, w sumie wykonane 100 tysięcy razy:

I: 28
K: 21

(Wyniki ujemne zawsze pomijam)

DEF SEG = 0
CLS
t1 = PEEK(1132)
FOR i = 1 TO 1000
FOR x = 1 TO 100
NEXT x
NEXT i
t2 = PEEK(1132)
PRINT t1; t2, t2 - t1

Widać, że dla interpretera ma to większe znaczenie niż po kompilacji. Ale jakieś znaczenie ma. Kompilator i tak musi rozmnożyć pętle na kilka.
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Czw 13:00, 28 Sty 2021    Temat postu:

Rozpisanie pętli pustej na 5 małych pętli:

I: 34 cyknięć
K: 26 cyknięć


DEF SEG = 0
CLS
t1 = PEEK(1132)
FOR a = 1 TO 10
FOR b = 1 TO 10
FOR c = 1 TO 10
FOR d = 1 TO 10
FOR e = 1 TO 10
NEXT e
NEXT d
NEXT c
NEXT b
NEXT a
t2 = PEEK(1132)
PRINT t1; t2, t2 - t1

Widać, że czas wykonania pętli wrósł nieznacznie. Polecenia nie zajmują szczególnie wiele miejsca i czasu.
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Czw 13:46, 28 Sty 2021    Temat postu:

100 tysięcy razy odczyt komórki pamięci.

I: 83 cyknieć
K: 37 cyknięć


DEF SEG = 0
CLS
t1 = PEEK(1132)
FOR i = 1 TO 100000
o = PEEK(1132)
NEXT i
t2 = PEEK(1132)
PRINT t1; t2, t2 - t1
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysłany: Czw 13:49, 28 Sty 2021    Temat postu:

Wpis wartości do komórki pamięci:

I:74 cyknięcia
K:23 cyknięcia

DEF SEG = 0
CLS
t1 = PEEK(1132)
FOR i = 1 TO 100000
POKE 0, 0
NEXT i
t2 = PEEK(1132)
PRINT t1; t2, t2 - t1
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)
Idź do strony 1, 2  Następny
Strona 1 z 2

 
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