Може би някои от вас са чували за UPX, може би – не. За това първо ще обясня какво представлява. UPX е една малка програмка, способна да компресира всякакви изпълними файлове, от повечето познати операционни системи, в това число Linux и Windows. Компресията е такава, че не променя по никакъв начин функционалността на съответния файл, а само размера му. Това става чрез т. нар. “прозрачна компресия” при която файлът се разкомпресира в оперативната памет при стартирането му (за сравнение, “нормалните”, т.е. некомпресирани файлове, просто се копират там). Теоретично, скоростта на зареждане се забавя малко ако файлът е компресиран, но на практика нормален човек не може да направи разлика.
Ако използвате UPX компресия, може да смалите драстично размера на много изпълними файлове (с ПЪТИ). Това е полезно ако ползвате софтуер върху флаш памет, или ако просто искате да спестите някой и друг мегабайт.
Повечето изпълними файлове могат да бъдат компресирани, а тези които не могат – просто не могат
Така че няма опасност да компресирате нещо и то да спре да работи…
Всъщност това все пак е възможно да се случи, но се случва много рядко, и то ако изпълнимият файл е малко по-нестандартен като формат. (няма нужда тук да се впускам в дълги технически разяснения ЗАЩО това се случва…).
Самата програмка с която компресирате в UPX е конзолна, и за нормалния потребител е малко неудобна. Затова преди време направих интерфейс за нея, чрез който можете да компресирате/декомпресирате един или много файлове, само чрез влачене и пускане. Програмката е само за Windows (към момента) и можете да я свалите от тази връзка. Това е инсталатор, просто му посочете папката в която искате да се инсталира UPXDrop.
Ето как изглежда самата програмка:
![]()
В падащият списък са изредени различни нива на компресия.
–best е най-доброто
-1 – най-лошото
-d – ако искате да разкомпресирате вече компресиран с UPX файл.
–force “форсира” компресията, независимо дали това може да повреди изходния файл (ако има някаква несъвместимост с UPX). Понякога, въпреки някоя несъвместимост, ако използвате –force, изходния файл си работи нормално, така че ще трябва да тествате в случай на проблеми с компресирането.
От личен опит мога да ви кажа, че под Windows съм компресирал всички възможни exe/dll файлове (непринадлежащи на windows), и съм спестил доста мегабайти така. Проблеми не съм имал. Нито един.














Привет
Ето тук можеш да прочетеш защо компресирането на изпълними файлове не винаги е удачно:
http://www.jrsoftware.org/striprlc.php#execomp
http://en.wikipedia.org/wiki/Executable_compression
Към графата “Личен опит” мога да добавя и успешното използване на UPX на вече архивният ми смартфон Motorola mpx200, който въпреки слабичкият си процесор и памет (133MHz CPU, 32MB Memory), се справя идеално. Всъщност именно той беше причината да обърна подобаващо внимание на UPX, докато търсех начин да сместя максимално количество програми в ограничената му памет. Въпреки недостатъците на тази техника (за които по-горе е споменал Данаил), мисля че тя е много полезна в системи с ограничено дисково пространство. Отсокоро използвам и Линукс версията на UPX върху EeePC, което също има ограничен обем от 4GB SSD. Сещам се и за още едно приложение – удачно е да се използва UPX компресия ако се налага да се стартират някакви изпълненими файлове по мрежата. Напр. в работата ми поне 40 души стартират една и съща програма ежедневно. Програмата е на споделено мрежово устройство и е около 14MB. С помощта на UPX размерът и пада да около 2.5MB, което е забележителна разлика, особено като се има предвид, че част от колегите се свързват през бавни модеми към корпоративната мрежа.
@Данаил, на теория тези неща които са написани там са верни. Но на практика направих следния тест:
Взех един некомпресиран изпълним файл под Windows (за да сме по-точни – програмката 7zip). Стартирах 10 негови инстанции.
Въпреки че на теория трябва неговите инстанции да споделят една и съща памет (т.е. да е зареден в оперативната памет само веднъж), отрих че след всяко стартиране, новата инстанция си консумира няколко мегабайта (около 4) оперативна памет (физическа, а не виртуална).
След това, компресирах изпълнимия файл с upx –best компресия. Пак го стартирах 10 пъти. Консумацията на памет беше абсолютно същата и растеше еднакво с всяка нова инстанция.
Повторих експеримента с друга програмка (viDrop). Резултатът беше същия. Не знам за DLL файлове (или други библиотеки) дали ще бъде различен, но определено за изпълними файлове няма разлика от гледна точка на консумацията на оперативна памет. Въпреки че уж ТРЯБВА да има:)
Предполагам че под Линукс ще има по-голяма разлика (в момента не мога да тествам).
@Данаил и lokster: То пък взе, че се заформи и дисусия за UPX…
Ами да продължим дискусията тогава
@lokster:
Теоретично погледнато, за да се проведе коректно опита, трябва да се вземат в предвид няколко неща: Когато се стартира програма, за нея се заделят 2 типа памет – за кода и за данните и. Когато стандартна (некомпресирана) програма се стартира в няколко инстанции, би трябвало кода да се зареди само веднъж, но за всяко стартирано копие се заделя отделен сегмент за данни, за да може например в едната инстанция на 7зип да си отворил един архив, а в другата – друг. Така че няма нищо чудно че при всички следващи инстанции се заделя една и съща памет – явно толкова и е нужна на програмата за сегмента за данни. Тъй като самия 7zFM.exe заедно с всички DLL-и които зарежда едва ли заема повече от 500 КВ, той не е най добрата програма за проба – може и да не си обърнал внимание в разликата в килобайтите, която е съществената в случая (защото това е кода на самата програма). А и не е сигурно Windows коя памет точно показва (дали показва цялата, или само заделената за данни, защото доколкото си спомням май се заделят чрез различен memory manager). Има и друг проблем – някои програми, когато се стартират в повече от едно копие, второто копие само уведомява първото да отвори още един прозорец, и се затваря. Така че за прецизен и достоверен опит е нужна специализирана програма, която може да показва стартираните в паметта модули, в колко копия са стартирани, и колко памет за код и данни заема всеки от тях.
Практически погледнато: Напълно съм съгласен със всички ползи които например Светли изтъкна. Понякога заеманото място и времето за зареждане е много по-важно. По-скоро имах в предвид, че ако човек реши да използва програмата за да си компресира например всички DLL-и на Windows-a, то резултата ще е по-скоро отрицателен
Затова и реших че е нужно да добавя коментара за недостатъците на компресирането на изпълними файлове – да не реши някой че това е панацеята, която ще му реши проблема когато дисковото му пространство започне да свършва…
ООО да:) Определено не се препоръчва компресирането на всички DLL-и на Windows-а. Абсолютно съм съгласен тук, и не го препоръчвам на никой.
Още повече че в стандартния случай, windows няма да ти позволи да компресираш някой от системните му файлове – Windows File Protection ще го възстанови като усети че е променян… А също не е възможно компресирането на заредени в момента файлове.
И накрая – поправям се:) Има разлика в консумацията на памет, гледал съм грешен показател. Повторих експеримента, този път в Sysinternals Process Explorer гледах “Working Set Private” за всяка инстанция. Когато файлът е компресиран с UPX, WS Private e по-голям отколкото ако не е. Разликата в големината е приблизително големината на изпълнимия файл.
Working Set Private е несподелената физическа памет която се консумира от даден процес.
Значи да обобщя какъв извод направих – ако се стартира само една инстанция на изпълнимия файл, няма разлика в количеството консумирана оперативна памет.
Ако се стартират повече инстанции – всяка нова инстанция на компресирания файл консумира допълнителна памет. Тук ще отбележа, че всяка нова инстанция на некомпресирания файл всеки път консумира още памет, но количеството и е по-малко отколкото ако е компресиран.
Мисля че в общия случай на система с ограничени ресурси, компресирането с UPX все пак е удачно – защото така или иначе няма да стартирате 10 еднакви програми наведнъж, а дори и да го направите, (пак в общия случай), консумираната физическа памет няма да е кой знае колко повече, освен ако самият изпълним файл не е ненормално голям. За сметка на това пък ще спестите доста дисково пространство.
с линукс никога несам се занимавал дръпнах приложението за уиндолс но като реших даго пробвам не ми показва каде да съхраня фаила или че е зипнат както при другите зип програми моля ви помогнете ми лаик сам а машинката ми е с ограничени ресурси