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

Używanie mniejszych typów zmiennych

+1 głos
116 wizyt
pytanie zadane 22 sierpnia 2021 w C# przez CdxProj Użytkownik (810 p.)

Hej. Zacząłem się dziś zastanawiać nad typami zmiennych. Mamy kilka typów dla wartości liczbowych, między innymi int, byte czy long. Wiadomo, te typy różnią się zakresem jak i możliwością przyjmowania wartości ujemnych. Oglądając tutoriale (czy to z c#, czy z c++) zawsze widziałem jak dosłownie każdy naukę zaczyna od inta i mam kilka pytań z tym związanych.

1. Dlaczego ten int jest tak wałkowany?

Tak na chłopski rozum, po co zajmować pamięć większymi typami zmiennych (bo rozumiem że to tak działa), zamiast np w pętli w którym zmienna nie przekroczy 10 używać typu który do tego w 100% wystarczy? Dlaczego praktycznie zawsze się widzi (for int i=1;i<=10;i++) zamiast np. (for byte i=1;i<=10;i++)? 

2. Czy faktycznie w pracy zwraca się na to uwagę?

To moje drugie pytanie, czy podczas tworzenia projektów zwraca się na to uwagę, czy się używa byte, int, short? Czy lepiej na sztywno przyjąć że używamy tego inta zamiast typów mniejszych i nie zawracać sobie tym głowy?

 

komentarz 23 sierpnia 2021 przez DarthMazut Bywalec (2,990 p.)
Zacznij pisać projekt, trochę większy niż "Hello World" i wszędzie tam gdzie ma to sens optymalizuj użycie int32 na np. byte. Np. wartości typu wiek, ilość rodzeństwa, czy ilość palców u ręki (przykłady z dupy) przechowuj w byte zamiast int. Już po niedługim czasie zorientujesz się, że ilość czasu i pracy jaką musisz poświęcić na konwertowanie w obie strony byte <==> int, jest niewspółmierna do zaoszczędzonej pamięci. Cały .NET framework operuje na intach.

Czy w pracy się zwraca na to uwagę? Tak ale tylko w specyficznych przypadkach, gdzie wpływa to na wydajność programu w widoczny sposób, (czyli w typowych aplikacjach nie). Nikt nie będzie poświęcał czasu programisty, żeby ten robił optymalizacje na poziomie nie zauważalnym dla klienta.

2 odpowiedzi

0 głosów
odpowiedź 22 sierpnia 2021 przez Whiskey_Taster Stary wyjadacz (13,540 p.)

Typ zmiennej int​​​​ jest zwykle najbardziej naturalnym typem dla komputerów, stąd najczęściej używa się go, a nie innych typów całkowitoliczbowych. Oczywiście wszystko zależy od wielu czynników, czasem ważna jest pamięć, czasem szybkość operacji, różnie bywa.

Czy w pracy się zwraca na to uwagę? Co prawda nie pracuję jako programista, ale myślę, że tak. Choćby z wyżej wymienionych powodów. 

komentarz 22 sierpnia 2021 przez CdxProj Użytkownik (810 p.)
Czyli w przypadku porównania czasu pracy pętli (załóżmy że ta pętla nic nie robi, nie ma żadnego kodu w środku). (for int i=1;i<=10;i++) vs. (for byte i=1;i<=10;i++). Ta pierwsza opcja będzie wydajniejsza?
komentarz 22 sierpnia 2021 przez Whiskey_Taster Stary wyjadacz (13,540 p.)
Ekspertem nie jestem, wiedzę opieram tylko na tym, o czym sam całkiem niedawno czytałem. Ale wydaje mi się, że tak, powinno to być bardziej wydajne. Imo z osądem ostatecznym poczekałbym na kogoś bardziej obeznanego z technikaliami :)
1
komentarz 22 sierpnia 2021 przez Oscar Pasjonat (24,050 p.)
Od razu wspomnę, że c# nie znam i nie używam, swoje uwagi opieram na C/C++.

Czasami porzeglądałem wygenerowany kod i tak ogólnie to zależy. Trzeba wziąć pod uwagę architekture procka i pamięci. W dzisiejszych czasach pojemność pamięci jest prawie nieograniczone, więc zmarnowanie tych paru bajtów nie jest problemem. Może się jednak nim stać gdy robimy jakieś tablice po miliony i więcej pozycji - wtedy trzeba oszacować, ile oszczędzamy. Nie czy się zmieści. Bo nawet jak się zmieści, to mamy systemy wielozadaniowe i co zaoszczędzi jeden proces może dostać inny.

A jeśli chodzi o szybkość - niektóre procki mogą użyć jednego rejestru jaki kilku rejestrów krótszych (szczególnie intel - od 8080 i B,C ->BC do AX, AL, AH), inne tak nie potrafią np.m68k - można użyć rejestru 8 bitowo, ale to nie daje możliwości użycia reszty (małym kosztem). W pierwszym przypadku użycie mniejszej zmiennej da możliwość użycia reszty rejestru na inną zmienną, więcej zmiennych można wrzucić do rejestrów. Spotkałem się też z sytuacją (ColdFire - mikrokontroler z uproszczonym rdzeniem m68k) gdy procesor nie miał polecen krótszej długości, wszystko liczył na 32 bitach. Zmienne 8 i 16 bitowe wymagały dodatkowych rozkazów do obcięcia wyniku.

Coraz częściej też kod jest wykonywany przez maszynę wirtualną, więc takie niskopoziomowe wnioski mogą nie mieć zastosowania. Niskopoziomowe optymalizacje lepiej zostawić kompilatorowi.
komentarz 22 sierpnia 2021 przez Oscar Pasjonat (24,050 p.)

@PH03NIX, A zamień kolejność pętli...

0 głosów
odpowiedź 23 sierpnia 2021 przez Pawel1995 Gaduła (3,160 p.)
Cześć, ciężko mi odpowiedzieć czemu jest tak wałkowany. Dla mnie jako programisty jest on najbardziej naturalnym typem danych. W programach gdzie nie chce mi się myśleć czy zmieszczę się zakresem małej zmiennej, oraz wiem że ten zakres nie przekroczy int(90% przypadków) to int jest po prostu wygodny. Wydaje mi się że jest na kursach tak wałkowany, bo kiedy nie robi nam znaczącej różnicy którego typu wybierzemy, int pozwala nam się bardziej wyluzować i po prostu skupić na logice programu, bez myślenia o zakresach.

Ja w pracy współpracuję z elektronikami, którzy pisząc programy BARDZO ale to BARDZO zwracają uwagę na typy danych. Dla nich byte i int absolutnie nie jest obojętny. W mikrokontrolerach oszczędza się każdy zasób rejestru, więc inta używają tylko tam gdzie faktycznie trzeba.

Natomiast od swojej strony zwracać muszę uwagę na typy, kiedy piszę interfejs, którym odbieram i dekoduję informację od czujników(które tworzą wspomniani elektronicy) oraz kiedy działam na strukturze danych która w sobie ma zmienne o różnych typach danych.

Kiedy piszę program sam dla siebie, bez integracji z urządzeniami zewnętrznymi oraz bez integracji z bazą danych, to używam tego co jest mi wygodnie, więc bez zastanowienia najczęściej jadę po intach(bo wygodnie:) ).

Ale odpowiadając na pytanie: Tak w pracy zwraca się na to uwagę, ale nie w każdym projekcie.

Podobne pytania

0 głosów
0 odpowiedzi 143 wizyt
pytanie zadane 2 maja 2020 w C# przez Jacob7 Użytkownik (540 p.)
0 głosów
0 odpowiedzi 123 wizyt
pytanie zadane 11 listopada 2020 w C i C++ przez mikilorix1029 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 99 wizyt
pytanie zadane 8 czerwca 2019 w C# przez MakaBresk Obywatel (1,060 p.)

87,902 zapytań

136,488 odpowiedzi

304,300 komentarzy

58,284 pasjonatów

Motyw:

Akcja Pajacyk

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

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

...