• 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?

+1 głos
159 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 (568,840 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,860 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 VIP (148,220 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,860 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 VIP (148,220 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,760 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,910 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ź 135 wizyt
–1 głos
3 odpowiedzi 228 wizyt
0 głosów
1 odpowiedź 352 wizyt
pytanie zadane 22 października 2017 w C i C++ przez Corvette 653 Początkujący (400 p.)

88,325 zapytań

136,919 odpowiedzi

305,559 komentarzy

58,598 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...