Działania na C++ | Czas

0

Czy działania różnią się między sobą, tzn. czy mnożenie zajmuje tyle samo czasu ile wymaga dodawanie, czy czas zależy jak dużą liczbę dodajemy lub mnożymy albo dzielimy, czy lepiej użyć k+2i czy k=i+i, czy lepiej x=x/2 czy x=x0.5 itd. Prosiłbym 5 pytań tego typu i na nie odpowiedzi. Dzięki

1

Na to pytanie nie można udzielić odpowiedzi, która będzie prawidłowa w 100%. Wszystko zależy na jaką platformę sprzętową programujesz i jak bardzo zaawansowanego kompilatora używasz. Jeśli mowa o PC czyli procesor x86-64 z OSem 64bit to w ogólności można przyjąć, że dodawanie, odejmowanie i mnożenie jest względnie tanie, schody zaczynają się od dzielenia.

Jeżeli potrzebujesz konkretów, musisz niestety sam sobie zmierzyć na platformie na którą piszesz.

0

@Nik 8899
Nie pytasz o typy.
Integerowe będą szybsze, zmiennoprzecinkowe wolniejsze (a mnożysz *0.5), a mieszanie obu na pewno nie jest korzystne.

Generalnie większość w/w pomysłów jest DZIŚ głup... nieaktualne. Już dawno się nie optymalizuje przez i+i o ile kieeedyś tak było (w co lekko wątpię)
To myślenie dinozaura sprzed 20,40 lat - lub onanizowanie się "jakim jestem hackerem".
Gdzieś spotkałem, ze dziś i*2, i/2 jest zamieniane przez kompilator na shift.

Jeśli dziś się pisze maksymalnie wyciśnięty kod, to chyba z szacunkiem dla cache, poboru z RAM, skoków (tam można naprawdę spieprzyć), a nie sprawdzając w tabelkach pojedyncze rozkazy.

@several
Sądzę, że z własnego amatorskiego mierzenia raczej niewiele wyjdzie. Amator nawet nie będzie świadomy CO MIERZY.
Moze bardziej przegląd wygenerowanego kodu.

0

Dopóki nie wymyślono komputerów kwantowych dzielenie będzie zawsze wolniejsze od mnożenia zaś dodawanie/odejmowanie wolniejsze od mnożenia.

0
Nik 8899 napisał(a):

Czy działania różnią się między sobą, tzn. czy mnożenie zajmuje tyle samo czasu ile wymaga dodawanie, czy czas zależy jak dużą liczbę dodajemy lub mnożymy albo dzielimy, czy lepiej użyć k+2i czy k=i+i, czy lepiej x=x/2 czy x=x0.5 itd. Prosiłbym 5 pytań tego typu i na nie odpowiedzi. Dzięki

We współczesnym C++ są zupełnie inne obszary pisania w stylu przychylnym do wydajnej optymalizacji, niż archaiczne tricki.
Wiele ich jest zbieżnych w dobrą czytelnością kodu: używanie const i cosntexpr gdzie możliwe itd.

Ma mikro g..nku Atmega8 tożsamy program przeniesiony z C do C++ okazał się o kilka bajtów mniejszy i jakieś niemierzalne nanosekundy można przypuszczać szybszy (Atmel Studio 7, wersja kompilatora gcc). Ach, to brzydkie i ciężkie w oczach elektroników C++

2

https://www.agner.org/optimize/instruction_tables.pdf (strona 10)

Typy i operacje całkowite

  • dodawanie jeden cykl (odejmowanie i dodawanie to dla komputera to samo).
  • mnożenie trzy cykle
  • dzielenie 41 cykli - przy czym jednostka wykonująca dzielenie całkowite, jest współdzielona miedzy wątkami, wiec koszt jest dużo większy, dlatego jeśli kompilator potrafi ustalić, że dzielnik jest stały, to robi rożne sztuczki by zamienić dzielenie na inne operacje (mnożenie, przesuwanie, dodawanie).

Dla typów zmiennoprzecinkowych, sprawy się znacznie komplikują, a operacje są dużo wolniejsze. Dzielenie nadal jest najwolniejsze.
Do tego dochodzi zasada "AS IF" z C i C++ i różne optymalizacje kompilatora, które potrafią obniżyć dokładność obliczeń zmiennoprzecinkowych, by zyskać na czasie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1