zakaznik/uzivatel/zadavatel ale obvykle nema sanci poznat, ze provozuje suboptimalni algoritmus. obvykle ani nic takoveho nechce, neoceni a zamitne uz pri naceneni..
Ma sanci, i kdyz ta suboptimalita vypada ruzne. Z praxe SW na evidenci lidi zvladal jako blesk demo s 15 lidmi, s 500 lidmi to bylo na starsim HW citelne pomale a s 1000 lidmi to bylo i na novem HW temer nepouzitelne, nebot kazda operace trvala nekolik sekund.
Je treba vedet, kdy optimalizovat. 50us vs 100ms na jednu akci nikdo nepozna i kdyz jde o vice nez 3 rady. 100ms a 5s pri kazde operaci uz je poradny rozdil, i kdyz to nejsou ani 2 rady.
už déle platí, že překladač generuje lepší strojový kód než člověk,
Sem se skoro pokecal ...
cece, si uvedom, ze prekladac NEVI a vedet nemuze, co ten kod ma delat. VZDY, ve 100% pripadu pak dela zcela obecny preklad. Jinak receno, musi brat v potaz vsechny moznosti. Programator ovsem VI (nebo by mel), co ze ten kod ma delat, a tudiz muze (a prave v tom spociva drtiva vetsina optimalizaci) znacnou cast jednoduse vynechat.
A co priklad takoveho kodu pro GCC nebo Intelovsky kompilator se zapnutymi optimalizacemi? (myslim i optimalizace jako -ffast-math, pouzivani unsigned kde treba, -march=native)
Druha pricina prednosti prekladace je citelnost. Muzu volat funkce a(), b() a prekladac je inline-uje a tak nechutne poprehazuje instrukce mezi nimi (kvuli vyuziti pipeline), ze se v tom nikdo na prvni pohled nevyzna. To nebude nikdo cist a udrzovat.
Naproti tomu, kdyz vam programator napise vysoce optimalizovany kod prekladajici 10 cinnosti do jedne, tak bude jedina mozna oprava bugu komplet prepis. Uprava muze znamenat jeste horsi vyuziti pipeline nez neoptimalizovany kod.
Zjistis, ze naprosto totez v naprosto stejnem rozsahu zvladal o 3-5 radu pomalejsi HW.
Nebylo to naprosto totez. Kdysi se pocitali vyplaty tak, ze se nacetl kus vstupu (nebo cely) do pameti, tam se to ponasobilo v jednom cyklu a vysledek se nekam vypsal.
Ted se pocitaji vyplaty tak, ze se spusti behove prostredi, v tom se nacte 20 000 trid, spusti se 10 vlaken na GUI, GC, RMI, vsechno je to treba synchronizovat, nektere tridy se zacinaji po nekolika volanich JITovat, co znamena neoptimalni vyuziti instrukcni cache a to mame jenom prostredi. Uzivatel vyuziva nejaky framework, ktery natahne dalsich 1 000 trid, ktere jsou natolik obecne, ze zvladnou prakticky vse. Uzivatel zavola vypocet vyplaty pro kazdeho zamestnance zvlast a program ceka na data pro lazy init stub. Ten sestavi SQL query. Udela se spojeni s DB (kdyz uz neni), SQL query se zapouzdri do paketu a posle se to do DB. DB rozparsuje query a v lepsim pripade podle indexu vyhleda zaznam. Zaznam se zapouzdri tak, aby se mohl poslat, odesle se do programu. Program ze sestaveneho paketu vytahne data, precte metadata a data nacpe do objektu. Toto vsechno vyhodilo z cachi, co se vlastne melo pocitat a tak se to znova natahne. Vynasobi se 2 hodnoty, ulozi se do objektu a je to treba persistovat. Tak se zjisti, co se vlastne zmenilo a to se posila do DB (opakuje se ten cirkus). Neco jako uvolnovani pameti programator nedela a GC musi prochazet reference vzdy kdyz proto dojde pamet.
A aby se nezapomelo, cele to bezi v okynku, ktere ma pruhledne pozadi a dela pekne efekty, ktere se daji porovnat s prvnimi simulacemi vybuchu atomove bomby.
Kdyz se k tomu prida vice urovni ruznych frameworku, pro jistotu nejaka ta bezpecnost a osetrovani chyb, ktere predtim nemohli nastat, tak mame zdroj problemu. Dnesni PC nepocitaji to same. Pocitaji zbytecnosti.