ورود

View Full Version : سوال: Optimize کردن حجم فایل اجرایی در کامپایلر



Mehdi Asgari
سه شنبه 28 آبان 1387, 10:46 صبح
من دارم روی optimization در کامپایلر های C/C++ مطالعه می کنم.
بیشتر از همه هم از MinGW و Microsoft C/C++ Compiler (که همراه VS هست) استفاده می کنم.
آقای Bjarne Stroustrop توی وب سایتش اشاره کرده (http://www.research.att.com/~bs/bs_faq.html#Hello-world) که سایز خروجی یک Hello World ساده باید یکسان باشه (البته گفته که این بستگی به کامپایلر داره و خودش از gcc توی یونیکس استفاده کرده)
حالا من میخوام به حداکثر بهینه سازی در سایز (حداقل سایز فایل خروجی) برسم.
این نتایج کارمه تا الان:


C with gcc: 15.5 KB
C with cl : 47 KB
C++ with g++: 477 KB
C++ with cl : 95.5 KB

with optimizations:
C with gcc /Os: 15.2 KB
C with cl /O1: 47 KB
C++ with g++ /Os: 476 KB
C++ with cl /O1: 92 KB


کامپایلر های استفاده شده:
Microsoft C/C++ Compiler 15.00
GCC 3.4.5 (MinGW)

دوستان اگر راه هایی جهت کاهش بیشتر سایز دارن اینجا بگن (البته راه های کامپایلری ، نه strip و upx و ...)
من هم نتایج مطالعاتم و جواب ایمیلم (if any!) از ایشون رو اینجا میذارم

Mehdi Asgari
سه شنبه 28 آبان 1387, 14:58 عصر
خب ، نتایج کارم تا الان:
این دو لینک رو بخونید:
http://msdn.microsoft.com/en-us/magazine/cc301696.aspx
http://www.phreedom.org/solar/code/tinype
در ادامه نتایج کارم رو می بینید. (strip و upx رو هم اضافه کردم. سویچ MD کامپایلر مایکروسافت هم خیلی جالب بود ، بهترین نتیجه رو داد. البته با این کار ، نیاز به MSVCRT.dll هنگام اجرای برنامه خواهیم داشت که همین dll loading خودش سربار داره ، ولی خب هدف این پست کمترین سایز خروجیه)
توجه: سویچ /OPT:NOWIN98 که در مقالۀ بالا بهش اشاره شده ، دیگه تو لینکر مایکروسافت ساپورت نمیشه (اگر هم بخوایم از /ALIGN استفاده کنیم ، باید سویچ /DRIVER رو هم به کار ببریم. (یعنی فقط برای device driver ها می تونیم این کارو بکنیم))
نتایج کارم :




C with cl : 47 KB (strip: 46.5 KB, upx -9: 24.5 KB)
C with cl /Ox /Os : 47 KB
C with cl /MD : 5.5 KB (strip: 5 KB , upx: 4 KB)
C with cl /O1 libctiny.lib : 2.5 KB (strip: 2 KB , upx: error)


C with gcc : 15.4 KB (strip: 5.5 KB , upx -9: 13.4 KB)
C with gcc -Os : 15.2 KB

C++ with cl : 95.5 KB (strip: 95 KB , upx -9: 45 KB)
C++ with cl /Ox /Os : 92 KB
C++ with cl /MD : 8 KB

C++ with g++ : 477 KB (strip: 270 KB , upx -9: 289 KB)
C++ with g++ -Os : 476 KB


خب ، اگه کسی لینک های داده شده رو مطالعه کرد و باز هم سوال داشت ، بپرسه.
در ضمن کسی کامپایلر یا راه بهتری سراغ داره ؟

Mehdi Asgari
یک شنبه 24 آذر 1387, 21:18 عصر
همین تست رو (با شرایط یکسان) با Tiny C Compiler (http://bellard.org/tcc/) انجام دادم ، حجم خروجی 1.5 کیلوبایت ( 1536 بایت) شد

AMIBCT
یک شنبه 24 آذر 1387, 21:57 عصر
دو تا کامپایلر رو فراموش کردید:

LCC
Pelles C

برای دستیابی به کمترین حجم ممکن یکی از بهترین گزینه‌ها همون TCC هست که ازش استفاده کردید

برای دستیابی به کمترین حجم با استفاده از VC می‌تونید از Libctiny استفاده کنید
پیوند دادن برنامه‌تون به جای کتابخانه‌ی استاندارد با این کتابخانه باعث می‌شه حجم برنامه خیلی کم بشه

مراحل بعدی Merge کردن بخش‌های فایل اجرایی، کم کردن Alignment، و فشرده‌سازی هست

فشرده‌سازی بیش از این حد بیشتر برای اهداف رقابتی انجام می‌شه

برای رسیدن به کمترین حجم ممکن یه فایل اجرایی باید از اسمبلر nasm استفاده کنید
اگه اشتباه نکنم کوچیک ترین فایل اجرایی که برای ویندوز ساخته شده 133 بایت بود که با همین nasm ایجاد شده بود

Mehdi Asgari
دوشنبه 25 آذر 1387, 02:35 صبح
دو تا کامپایلر رو فراموش کردید:
من به همۀ کامپایلر ها دسترسی ندارم؛ وگرنه Borland C++ و Intel C++ Compiler و Watcom رو هم باید می آوردم در این مقایسه.
LCC Win32 رو تست کردم. سایز فایل اجرایی خروجی 47.5 کیلوبایت هست

(Pelles و Borland رو هم تست می کنم و اینجا می نویسم)

Mehdi Asgari
دوشنبه 02 دی 1387, 01:22 صبح
Pelles C Compiler (http://www.smorgasbordet.com/pellesc/) : 28.5 KB
C++ Builder 2009 (http://www.codegear.com/products/cppbuilder): 6.5 KB