|
Życie Wieczne
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
Wysł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ść
|
Wysł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ść
|
Wysł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ść
|
Wysł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ść
|
Wysł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ść
|
Wysł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ść
|
Wysł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ść
|
Wysł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ść
|
Wysł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ść
|
Wysł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ść
|
Wysł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ść
|
Wysł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ść
|
Wysł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ść
|
Wysł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ść
|
Wysł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 |
|
|
|
|
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
|