Życie Wieczne
FAQ
Szukaj
Użytkownicy
Grupy
Galerie
Rejestracja
Profil
Zaloguj się, by sprawdzić wiadomości
Zaloguj
Forum Życie Wieczne Strona Główna
->
Offtopic
Napisz odpowiedź
Użytkownik
Temat
Treść wiadomości
Emotikony
Więcej Ikon
Kolor:
Domyślny
Ciemnoczerwony
Czerwony
Pomarańćzowy
Brązowy
Żółty
Zielony
Oliwkowy
Błękitny
Niebieski
Ciemnoniebieski
Purpurowy
Fioletowy
Biały
Czarny
Rozmiar:
Minimalny
Mały
Normalny
Duży
Ogromny
Zamknij Tagi
Opcje
HTML:
NIE
BBCode
:
TAK
Uśmieszki:
TAK
Wyłącz BBCode w tym poście
Wyłącz Uśmieszki w tym poście
Kod potwierdzający: *
Wszystkie czasy w strefie EET (Europa)
Skocz do:
Wybierz forum
----------------
Ogólna dyskusja
Kościół rzymsko katolicki
Biblia
Objawienia
Własne przemyślenia
Inne religie i ateizm
Nasza twórczość
Offtopic
Przegląd tematu
Autor
Wiadomość
Piotr-246
Wysłany: Czw 16:36, 28 Sty 2021
Temat postu:
Teraz widać, że o ile polecenie Peek potrzebuje 1.73 jednostki czasu na pobranie jednej komórki pamięci, o tyle 100 komórek pamięci ekranu pobranych poleceniem GET porzebuje tylko 26.67 jednostek czasu
Get działa tu kilka razy szybciej niż Peek. Co może oznaczać, że GET wykorzystuje wewnętrzne mechanizmy komputera do przenoszenia dużych strumieni danych.
Piotr-246
Wysłany: Czw 16:30, 28 Sty 2021
Temat postu:
10 tysięcy razy pobranie fragmentu ekranu instrukcją GET, Lecz obszar 100 razy większy.
I:68 cyknięć
I:56 cyknięć
W przeliczeniu na jednostki:
I:0.0068 (32.38 jednostek)
K:0.0056 (26.67 jednostek)
SCREEN 13
DEF SEG = 0
DIM a(0 TO 51) AS INTEGER
t0 = PEEK(1132)
FOR i = 1 TO 10000
GET (100, 100)-(109, 109), a
NEXT i
t1 = PEEK(1132)
PRINT t0; t1, t1 - t0
input a
Piotr-246
Wysłany: Czw 16:20, 28 Sty 2021
Temat postu:
Użycie instrukcji GET - pobranie tylko 1 punktu, jednak nie 100 tysięcy razy, a 10 tysięcy
I:35 cyknięć
K:26 cyknięć
w przeliczeniu na jednostki będzie to:
I:0.00350 cyknięcia (16.67 jednostek)
K:0.00260 cyknięcia (12.38 jednostek)
SCREEN 13
DEF SEG = 0
DIM a(0 TO 2) AS INTEGER
t0 = PEEK(1132)
FOR i = 1 TO 10000
GET (100, 100)-(100, 100), a
NEXT i
t1 = PEEK(1132)
SCREEN 0: PRINT t0; t1, t1 - t0
INPUT a
Piotr-246
Wysłany: Czw 13:56, 28 Sty 2021
Temat postu:
Podsumowanie - przeliczenie na jednorazowe wykonanie polecenia:
Pusta pętla:
I: 0.00024 cyknięcia
K: 0.00021 cyknięcia (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ęcia (5.9 jednostek)
K: 0.00100 cyknięcia (4.77 jednostek)
Dodawanie a = 1.013456789# + 2.0123456789#
I: 0.00041 cyknięcia (1.96 jednostek)
K: 0.00026 cyknięcia (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 cyknięcia (6.76 jednostek) gdy operacja jest oznaczona znakiem ^2
I: 0.00041 cyknięcia (1.96 jednostek) gdy operacja jest rozpisana na mnożenie
K: 0.00113 cyknięcia (5.38 jednostek) gdy operacja jest oznaczona jest znakiem ^2
K: 0.00026 cyknięcia (1.24 jednostek) gdy operacja jest rozpisana na mnożenie
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
Rozpisując pętle pustą na dwie pętle, w sumie wykonane 100 tysięcy razy:
I: 0.00028 cyknięcia (1.33 jednostki)
K: 0.00021 cyknięcia (1 jednostka)
Rozpisanie pętli pustej na 5 małych pętli:
I: 0.00034 cyknięcia (1.62 jednostki)
K: 0.00026 cyknięcia (1.24)
100 tysięcy razy odczyt komórki pamięci.
I: 0.00083 cyknięcia (3,93 jednostki)
K: 0.00037 cyknięcia (1.73 jednostki)
100 razy wpis wartości do komórki pamięci:
I:0.00074 cyknięcia (3.52 jednostki)
K:0.00023 cyknięcia (1.1 jednostki)
Piotr-246
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
Piotr-246
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
Piotr-246
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.
Piotr-246
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.
Piotr-246
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ą.
Piotr-246
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.
Piotr-246
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
Piotr-246
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
Piotr-246
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
Piotr-246
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.
Piotr-246
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
fora.pl
- załóż własne forum dyskusyjne za darmo
Powered by
phpBB
© 2001, 2005 phpBB Group
Regulamin