Napomena: poruka je malo poduža, a vi izaberite ,,masno'' naslovljen deo koji vas zanima
Na poslednju poruku...
Citat:
Hm, slazem se sa Tatkom :D Pokusavanje ovakvog optimizovanje ne moze da se generalizuje na sve profile programera (i samim time, velicati ga kao "jedini, pravi, istinski, hard-core, itd" programming).
Ne mogu da se složim; razlozi dati niže.
Citat:
Mozda je vazno nekome ko radi na kompajleru, low-level biblioteci i slicno, ali ne i ostalima.
Prvo, to ,,slično'' uključuje i one koji rade sa grafikom, zvukom, videom, (de)kompresijom, mrežama (grafovi i načini pravljenja softvera za rutere), i ko zna šta sve ne (upis fajlova na disk (fajlsistemi), traženje najmanjih razlika među fajlovima (diff), zadovoljavanje međuzavisnosti (make)...)
Zapravo, to je ono što zovemo
programiranje.
Citat:
Kada i hocu da nacrtam nesto, uzecu i koristiti taj moveTo i lineTo sasvim spokojno, jer je armija programera vec pretresla podlogu i njihovu optimizaciju kroz niz godina i ne pada mi na pamet da smisljam rupu na saksiji.
Naravno, ali nemoj se zavaravati da si ti programer. Jednostavno ,,skript'' programiranje je sastavni deo upotrebe računara, i to je ono što svaki korisnik
treba da radi: ne može niko predvideti sve operacije koje nekome mogu zatrebati, i zato postoje skript jezici. Izrada VBA koda ili PHP web stranica je ograničenog delokruga, i u tim poljima postoje druga, značajnija ograničenja (protok mreže, pristup podacima sa diska,...), pa je optimizacija nepotrebna.
Slično je i sa upotrebom gotovih biblioteka: ti si
korisnik programa, bez obzira na to što i ti napišeš malo koda, ali to nije ovde pomenuto
pravo programiranje, već najobičnije, i neophodno ,,skript'' programiranje. Neki shell korisnici ukucavaju i složenije programske linije pomoću gotovih ,,biblioteka'' (programa preko
pipes) nego što to rade mnogi u C++-u ili nečemu drugom. Međutim, za takvu upotrebu je upravo i nastao izraz "skript", a ne "program" (nadam se da je jasna razlika koju hoću da istaknem, i pored nezgode da je i svaki "skript" istovremeno i program).
Citat:
Uostalom, zato od pocetka i postoji koncept biblioteka - ko ce sve da pise od pocetka ? Slazem se posebno i sa delom oko citljivosti koda - kada se radi u timu (uz podrazumevanu fluktuaciju programera), to moze biti zlata vredno.
Vrednost biblioteka je poznata, i to ne sporim. Prosto umeće upotrebe istih ne čini bilo koga programerom.
Što se tiče čitljivosti koda, primećujem izvesne nedoslednosti. Tvrdiš kako postoje biblioteke koje su ljudi optimizovali što je bolje moguće, i koristiš samo njihov interfejs (znači uopšte ne čitaš kod), a odjednom ti je stalo da kod bude čitljiv.
Baš kada se radi u timu, tada je najmanje važno da kod bude čitljiv, već da interfejs bude dobar i upotrebljiv. Čitljivost je bitna samo za onoga koji održava, i koji će u budućnosti održavati dotični kod.
Pored svega ovoga, pretpostavljam da si ti preskočio osnovnu školu (nećeš valjda da ,,smišljaš rupu na saksiji''; pa ljudi su naučili da pišu i broje još pre više vekova). Ukoliko je tako, slažem se da treba da preskočiš i osnovno programersko obrazovanje.
A na temu optimizacija...
Što se tiče optimizacija, Dejan Lozanović je naveo neke konstantne (kao što su šiftovanje umesto množenja sa 2^n, množenje umesto deljenja), i tu su vaše primedbe na mestu: dvostruko (ili možda 1,03-struko) ubrzanje nisu vredni gubljenja čitljivosti koda (za to se uzme dva puta brži procesor, i eto rešenja).
Međutim, on je izdvojio i jednu optimizaciju koja ipak nije konstantna, već se radi o prelazu sa kvadratne na linearnu složenost (ako množenje računamo kao linearno slaganje sabiranja, mada se uglavnom implementira kao logaritamsko). Složićete se da je mnogo bolje kada se rezulatat dobije u N=1000 koraka nego u N^2=1000000 koraka. A tek kada se radi o prelazu sa eksponencijalne na polinomijalnu složenost (ili logaritamsku), dobici su mnogo veći.
Naravno, sve vaše tvrdnje su tačne u ograničenom polju delovanja: jednostavnije poslovne aplikacije sa manjom količinom podataka. Međutim, kada treba da pristupite većoj količini podataka (npr. primljeni podaci u Aresibu), i istu da obradite, najvažnije optimizacije će doći do izražaja:
izbor boljeg algoritma.
I konačno o samom zadatku...
Prema tome, za dati problem sa zagradama (ili prema srkijevoj reformulaciji), treba naći bolji algoritam, a ne brinuti se oko brzine množenja i deljenja, sabiranja i oduzimanja. Mada može dosta doprineti, to se može izvesti i mehanički (kompajleri), a i najbolje je to raditi tek za najbolji poznat algoritam.
A o praktičnosti ovog problema, evo vam primera.
Imate
Tag pri obradi XML dokumenta, koja naravno može sadržati nijedan, jedan ili više drugih
Tag-ova, prema određenoj DTD. Provera validnosti nekog XML dokumenta je nešto složenija od datog problema zbog složenije prirode pravila XML-a, ali i nešto jednostavnija pošto se radi o proveri pripadnosti konkretne vrednosti (instance) skupu svih vrednosti, a ovde se traži kardinalnost tog skupa vrednosti.
Primer koji se sam po sebi nameće je, naravno, obrada LISP koda, ili bilo kakvog drugog koda koji ima slično definisana pravila ugnježdavanja (da li su zagrade ili nešto drugo nije toliko bitno).
I malo brbljanja
Ko i dalje ne veruje u prednosti optimizacije, neka proba da aktivno radi na Word dokumentu od 2000 strana (znači ne da dodaje tekst na kraj, nego da menja i dodaje sadržaj u sredinu, i sve ostale gluposti). Moja iskustva su zasnovana na starijim Word izdanjima -- 1995/97 -- pa situacija može biti sada mnogo bolja.
Kod sledećeg javljanja na ovu temu se nadam da ću dodati i moju verziju koda za postavljeni problem.
Pozdrav
PS. Biblioteke služe da se uštedi vreme, a ne pamet.
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.