I opet bi trebalo biti br¾e? Npr. uèitati 100 MB i slo¾iti u memoriju, ili uèitati samo 30 MB, dekomprimirati i slo¾iti u memoriju! ©to je br¾e?
I opet bi trebalo biti br¾e? Npr. uèitati 100 MB i slo¾iti u memoriju, ili uèitati samo 30 MB, dekomprimirati i slo¾iti u memoriju! ©to je br¾e?
Ovisno da li je ono sto ti program u pitanju radi CPU intensive, ili I/O intensive, kakav si sa slobodnom memorijom, da li je neki low-power low-CPU laptop/mobile device ili 16-CORE desktop koji trosi struje kao pecnica itd.
Primjeti da se ne radi samo o CPU potrebnom za dekompresiju, nego neke stvari koje ne trose nista vremena na raw I/O (tipa seek), moraju trositi nekih resursa na compressed. Recimo, da imas executable od 200MB i startao si ga, ovako ti izgleda usporedba 4 osnovne mogucnosti (postoje i manje varijacije na temu, ali to cemo ignorirati za potrebe ove skolice):
(1) raw I/O varijanta (dakle ono standardno, bez kompresije):
- OS ucita 4kb sa diska sa offseta 0 iz .exe (velikog 200MB na disku)
- execute na offset 0
- program nesto malo radi pa napravi JMP na 100ti MB
- OS ucita 4kb sa diska sa offseta 100MB iz .exe
- execute na offset 100MB [itd]
Prednost: bez CPU/memory overheada, inicijalno mali I/O Nedostatak: sto dalje se izvrsava program, tim veci I/O (ucitavanje uncompressed podataka), te vece zauzece diska za .exe
(2) compressed varijanta 1 (demand paging loading, full compression):
- OS ucita 1kb sa diska sa offseta 0 iz .exe (velikom 50MB na disku)
- OS dekomprimira taj 1kB i dobije 4kB uncompressed
- execute na offset 0
- program nesto malo radi pa napravi JMP na 100ti MB
- Oops. Gdje je uncompressed offset 100000000 u compressed fileu? to se ne moze znati. Pa OS mora citati sa diska sve dok ne procita 100MB uncompressed. Dakle treba procitati i dekomprimirati recimo 25MB compressed dok ne dodje do 100tog MB uncompressed; te tek tada moze ucitati 1kb compressed sa diska sa offseta 100MB iz .exe!
- OS dekomprimira taj 1kB i dobije 4kB uncompressed
- execute na offset 100MB
- (2a) procitanih 25MB sa diska odbaciti (pa ces ustedjeti memoriju, ali slijedeci put opet moras citati sve!) ili (2b) procitanih 25MB sa diska zadrzati u memoriji da imas za sljedeci puta (ali trosis memoriju!) [itd]
Prednost: dosta manji I/O (compressed data) za linearno citanje Nedostatak: puno veci CPU usage *uvijek*. Ako je I/O citanje random a ne linearno, puno veci I/O pocetno. Nakon toga za ostala random citanja je ili i dalje puno veci I/O (2a) ili puno veca potrosnja memorije (50MB).
(3) compressed varijanta 2 (demand paging loading, lower segmented compression: .exe je pakiran u segmentima od recimo 8MB sto daje dosta losiju kompresiju od (2))
- OS ucita 1kb sa diska sa offseta 0 iz .exe (velikom 100MB na disku)
- OS dekomprimira ta 1kB i dobije 4kB uncompressed
- execute na offset 0
- program nesto malo radi pa napravi JMP na 100ti MB
- Oops. Gdje je uncompressed offset 100000000 u compressed fileu? Ne znamo. Ali znamo [zapisalo smo u exe, zato i niza kompresija uz ostalo] da: - 8MB compressed pocinje na npr 17MB uncompressed - 16MB compressed pocinje na npr 35MB uncompressed - 24MB compressed pocinje na npr 51MB uncompressed - 32MB compressed pocinje na npr 55MB uncompressed - 40MB compressed pocinje na npr 65MB uncompressed - 48MB compressed pocinje na npr 79MB uncompressed - 56MB compressed pocinje na npr 91MB uncompressed - 64MB compressed pocinje na npr 101MB uncompressed Na osnovu toga, OS zna da sa diska treba procitati samo 8MB izmedju 56MB i 64MB compressed. Pa onda OS procita tih 8MB i dekomprimira ih.
- execute na offset 100MB
- (3a) procitanih 8MB sa diska odbaciti ili (3b) procitanih 8MB sa diska zadrzati u memoriji da imas za sljedeci puta [itd]
Prednost: relativno manji I/O (compressed data) za linearno citanje Nedostatak: primjetno veci CPU usage *uvijek*. Ako je I/O citanje random a ne linearno, nesto veci I/O pocetno. Nakon toga za ostala random citanja je i dalje primjetno veci I/O (3a) ili nesto veca potrosnja memorije (3b)
(4) compressed varijanta 3 (full loading, full compression):
- OS ucita svih 50MB compressed sa diska
- OS dekomprimira tih 50MB compressed u 200MB uncompressed
- execute na offset 0
Prednost: dosta manji I/O (compressed data) *uvijek*! nema I/O pauza u toku izvrsavanja programa (ako imas dovoljno memorije)!
Nedostatak: ogroman CPU load, velike pauze kod startanja programa (nema demand paging loadinga, pa se uvijek ucitava i dekomprimira 100% programa bez obzira sto ces koristiti mozda samo 30% koda tog programa), ogromna potrosnja memorije (i vezano uz to: nemogucnost koristenja vise velikih programa odjednom bez kupovine dodatne memorije itd, nemanje memorije za cachiranje I/O podataka i write-back casha na diska, dakle sporiji writeovi i readovi podataka sa diska itd).
Pouka1: there ain't free lunch! Pouka2: stvari *nikada* nisu tako jednostavnima kako izgledaju.
Tako da - probaj staviti tu kvacicu na "compress drive" pa vidi da li ce ti u tvom slucaju biti brze ili sporije. Ili nabavi executable compressor pa probaj s njim. itd. Pa vidi sto je tebi najprihvatljivije.
-- Opinions above are GNU-copylefted.
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.