wydajność w C++

0

Cześć. Mam pytanie. W kursie dot. C++ dot. wydajności znalazłem taką narysowaną piramidę, gdzie na samej górze było:

  1. Dodawanie, odejmowanie, mnożenie -> czyli najszybsze
  2. Dzielenie, funkcje transcendentalne
    3.transcendentalneBranching, metody wirtualne, skok pod wskaźnik
  3. Dynamiczna alokacja pamięci
  4. Zasoby systemowe –tekstury, wątki, gniazda
  5. Wejście-wyjście –pliki, sieć
    Chodzi mi o punkt 3 i 4, tzn. co oznacza "skok pod wskaźnik"? Jak wygląda i co oznacza taka operacja?
    oraz czemu się tam znalazło i co oznacza "dynamiczna alokacja pamięci" - czyli chodzi o samo użycie operatora new? Tzn. że użycie new jest wolniejsze od mnożenia czy chodzi o używanie zdefiniowanych zmiennych operatorem new - czy jeszcze o coś innego?
    dzięki za wyjaśnienie
0

To jakieś dziwne rzeczy, zmień kurs.

Właśnie sobie go przejrzałem (funkcje transcendentalne, wtf, tylko jedno trafienie w Google). Ten opis jest w miarę nowy a i tak sporo w nim błędów, ucz się języka z czegoś porządnego. (To ciekawe, bo koleś ma chyba spore doświadczenie - tak wynika z jego strony)

O co mi chodzi:

  • W 2010 roku pisze, że C++ jest nieustandaryzowany. :-D
  • "Nie ufać optymalizacji kompilatora". Odwieczny pojedynek kompilator vs programista zawsze moim zdaniem wygrywa ten pierwszy.
  • Ta piramida to jakaś pomyłka. Co takie porównanie ma niby dać? Nie da się zrobić gniazd za pomocą mnożenia i dodawania, to porównywanie zupełnie niezwiązanych funkcjonalności.
  • Półprawda o wyjątkach. (zero-cost model of exception handling)
  • O alokacji w STL też nie cała prawda. Można napisać swój alokator, który nie będzie nic używać alokacji na stercie.

Takie rady może są dobre, żeby je zapamiętać i mieć gdzieś z tyłu głowy. W końcu nie ma rzeczy idealnych. Ale to raczej specyficzne przypadki, uczenie się w ten sposób jest moim zdaniem błędem. Najważniejsza wg mnie rada to ta dotycząca prędkości pamięci i lokalności danych.

0

Ja bym przestał to czytać już po:

Za dużo getterów i setterów? Pisać struktury, pola publiczne

Z tym ufaniem optymalizacji to chyba chodzi mu o to żeby nie zakładać że kompilator zoptymalizuje i będzie działać szybko nawet jeśli algorytm jest do d**y. I ma rację ;)
Z piramidką to chodzi chyba o czas wykonywania operacji tego typu / na obiektach tego typu. Wiadomo że jak przeładujesz program operacjami I/O żeby uniknąć kilku operacji matematycznych, to będzie to bez sensu ;)
Znów przestałbym czytać po:

Unikać std::list, std::set, std::map, najlepszy jest std::vector

Nie bardzo rozumiem jak on "porównuje" map czy set do vectora, kiedy to są zupełnie różne struktury danych...

0

dzięki. A o co mu chodzi odnośnie "skok pod wskaźnik"? Co to oznacza i jak to się robi?

0

Mały OT, polski termin, to funkcja przestępna, a nie transcendentalna.

0

(funkcje transcendentalne, wtf, tylko jedno trafienie w Google).
jak wpiszesz w liczbie pojedynczej „funkcja transcendentalna”, gógiel podpowiada "Did you mean: funkcja transcendentna", a to z kolei zwraca różne „MANDALA - Symbol Jaźni i jedności duszy” i podobne filozofie.

Nie ma to jak bezmyślnie „tłumaczyć” bez sprawdzania czy istnieje już właściwy termin…

0
Michal94 napisał(a):
  1. Dzielenie (...)
  2. (...) metody wirtualne, skok pod wskaźnik
  3. Dynamiczna alokacja pamięci

bzdura. div 32-bit trwa 26 cykli (i to na i7! na starszych procesorach bywało to i kilkaset cykli), a 64b to 89 cykli, nie mówiąc już o dzieleniu zmiennoprzecinkowym. dwa sięgnięcia do pamięci miałyby trwać dłużej? dynamiczna, sprzętowo wspomagana alokacja pamięci miałaby być na tyle wolniejsza od dzielenia, że wylądowała dwie przegródki niżej?
panie Sawicki, chrzanisz. i jeszcze te "funkcje transcendentalne".

0

dzięki. A o co mu chodzi odnośnie "skok pod wskaźnik"? Co to oznacza i jak to się robi?

W zasadzie to samo co funkcje wirtualne, tylko że jawne - wykorzystując, istniejącą już w C, możliwość tworzenia wskaźników do funkcji (z piękna składnią): http://ideone.com/s6Hay

#include <iostream>

typedef int (*fxp)(int);
int foo(int i) {
    std::cout << "foo " << i << std::endl;
}
 
int bar(int i) {
    std::cout << "bar " << i << std::endl;
}
 
int main() {
    fxp f = foo;
    f(2);
    f(3);
    f = bar;
    f(2);
    f(3);
}
1. Dodawanie, odejmowanie, mnożenie -> czyli najszybsze
2. Dzielenie, funkcje transcendentalne
3.transcendentalneBranching, metody wirtualne, skok pod wskaźnik
4. Dynamiczna alokacja pamięci
5. Zasoby systemowe –tekstury, wątki, gniazda
6. Wejście-wyjście –pliki, sieć

Niestety, z żalem stwierdzam że ta lista jest bez sensu i nie ma się po co nią kierować przy pisaniu programów.

0

W ogóle taką listę należy traktować jako „mniej-więcej”, bo wszystko to zależy od kompilatora (optymalizacji kodu), komputera, systemu operacyjnego, bieżącego obciążenia.
Na przykład alokacja pamięci jest zazwyczaj szybsza od operacji sieciowych, ale co jeśli sieć mamy szybką, ale pamięci za mało i swap mieli dyskiem przez minutę?

0

Dzięki wielkie za wyjaśnienie :)

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