• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tablica vs wiele zmiennych - czy programom to jakoś przeszkadza?

VPS Starter Arubacloud
+1 głos
233 wizyt
pytanie zadane 11 stycznia 2019 w Algorytmy przez TeslaX93 Gaduła (3,590 p.)

Nie wiedziałem do jakiej kategorii to wrzucić.

Załóżmy, że jesteśmy totalnym nowicjuszem i piszemy swój pierwszy program w jakimkolwiek języku, nie mając pojęcia o istnieniu tablic. Piszemy coś takiego:

$zmienna1 = 0;
$zmienna2 = 8;
$zmienna3 = 1;
...
$zmienna999 = 100+500+100+900;

i tak dalej.

Po wrzuceniu takiego kodu na to forum, każdy złapałby się za głowę i nakazałby temu początkującemu programiście powrót do nauki języka i wykucie tablic. 

Ale pomimo tego, czy istnieje jakakolwiek różnica w szybkości działania takiego programu, zajętości pamięci, etc, jednym słowem - czy poza tym, że kod wygląda źle i niechlujnie, to czy kompilatorowi i procesorowi robi to jakąś znaczącą różnicę?

4 odpowiedzi

+3 głosów
odpowiedź 11 stycznia 2019 przez Comandeer Guru (599,730 p.)
Jak dla mnie to złe podejście do problemu. Języki programowania powstały dla ludzi, by to im się lepiej pisało i czytało kod. Czytelność praktycznie zawsze jest ważniejsza od wydajności (oczywiście w sensownych granicach), bo kod piszemy dla ludzi, nie dla maszyn.

Co do wydajności, prawdopodobnie będzie porównywalna, ale mogą być różne drobne różnice pomiędzy poszczególnymi językami, wynikające choćby z ich semantyki.
0 głosów
odpowiedź 11 stycznia 2019 przez RafalS VIP (122,820 p.)
Raczej nie ma. W C++ można bardzo łatwo sprawdzić, że wygenerowane assemblery nie roznia sie niczym:

https://godbolt.org/z/LH-hBx

W innych językach może być lekka. Np w Javie tablica jest obiektem, więc program będzie się różnił o ten dodatkowy obiekt, który trzeba zaalokować.
komentarz 11 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)
Dodaj optymalizację i zobacz co dzieje się w przypadku tablicy i zmiennych jak włączy się wektoryzacja instrukcji.
komentarz 12 stycznia 2019 przez RafalS VIP (122,820 p.)
Tylko z optymalizacją na dowolnym poziomie dla gcc kod zawsze zostaje uproszczony do stałych, więc ciężko cokolwiek zobaczyć.
0 głosów
odpowiedź 11 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)
W świetle badań psychologicznych, średnio rozgarnięta osoba potrafi śledzić do 5 czynników wpływających na rozwiązanie. Stąd istotne przekraczanie ilości zmiennych powyżej 5 w jednostce kodu (np. funkcji), odbija się niekorzystnie na kontroli intelektualnej całości kodu. Inne czynniki bierze się pod uwagę w dalszej kolejności lub zmienia się ich znaczenie w bardzo konkretnych przypadkach. Oprogramowanie trzeba utrzymywać nie ze względu na to co potrafi procesor a co rozumie człowiek.

Im lepiej (w bardziej zbliżony do oczekiwań) wyrazisz swoją potrzebę w kodzie, tym większą masz szansę że efekt interpretowanego lub kompilowanego programu będzie Ci odpowiadał. Jeśli dane są w naturalny sposób w tablicy, powinny być tak zapisane. Dajesz wtedy szansę np. kompilatorowi by to odkrył i wykonał optymalizację. Jeśli rozbijesz je na oddzielne zmienne "bo inaczej nie umiesz", dostaniesz coś z czego możesz być niezadowolony.

Powód "bo komputera to nie obchodzi jak to zapiszę" nie jest wystarczający do pisania jak się chce.
–1 głos
odpowiedź 11 stycznia 2019 przez Kabuuz Bywalec (2,820 p.)
Jakos super się nie znam ale według mnie np. dla C/C++ tablica byłaby szybsza przy zastosowaniu wskaźników. Bo tak to program musi sprawdzić adres i dopiero iść do tego adresu a tak to pomija sprawdzanie bo ma go wpisanego (o takim czymś wspominał chyba pan Zelent w swoim kursie). Co do ilości miejsca zajmowanego przez zmienne to będzie to samo. Co do pamieci programu to nie jestem jakoś super pewien ale jak masz tablice no to jednak starcza 2 linijki i możesz zmienić każda wartosc elementu w pętli. A jak będziesz musiał wklepac 1000 linijek to pamięć programu się zwiększy.
2
komentarz 11 stycznia 2019 przez miro Pasjonat (23,870 p.)

Co do pamieci programu to nie jestem jakoś super pewien ale jak masz tablice no to jednak starcza 2 linijki i możesz zmienić każda wartosc elementu w pętli. A jak będziesz musiał wklepac 1000 linijek to pamięć programu się zwiększy.

Przecież ilość linijek kodu nie jest w żaden sposób miernikiem zajętości pamięci. Obliczanie ciągu Fibonacciego w zwykłej rekurencji jest dobrym przykładem.
Po drugie RafalS dał link w którym widać, że obie metody zajmują tyle samo pamięci. 

Podobne pytania

0 głosów
1 odpowiedź 235 wizyt
–1 głos
3 odpowiedzi 406 wizyt
0 głosów
1 odpowiedź 467 wizyt
pytanie zadane 22 października 2017 w C i C++ przez Corvette 653 Początkujący (400 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...