-
09-03-2010, 10:53 AM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Các kỹ thuật optimize code của VC++ 200x Compiler
Hi all !
Tính tui hay build code trong Release mode rồi open it in IDA để xem code ASM mà VC++ compiler sinh ra. Một thời gian dài, tui đi từ ngạc nhiên này đến các ngạc nhiên khác về kỹ thuật optimize code của VC++ compiler từ 2003 về sau này (2010 tui chưa install, lười rồi).
Dưới đây, tui xin mạo muội trình bày một số kỹ thuật optimize code của VC++ compiler mà tui đã biết và trong các article trên Internet:
1. Loại bỏ biến, code thừa, không dùng, tự tính toán constant:
vd:
Mã:void Func(){ int A = 2; int Size = 3 * 8 * A; UpdateSize(Size * 5);}
Mã:void Func(){ UpdateSize(240);}
2. Loại bỏ các biến copy không dùng
Mã:void f(int g){ int j = g; func(j * 2);}
Mã:void f(int g){ func(g * 2);}
3. Tự đông sinh code inline cho các function nhỏ (không cần phải declare inline), vd memcpy, strcpy....
4. Còn tiếp...View more random threads:
- OpenMP for beginner!!!
- Hướng dẫn viết một chương trình chạy nền bằng VC++
- Hiểu COM là gì?
- Làm quen với lập trình MFC - VS2008
- Hướng dẫn viết một chương trình Sniffer
- Inject Code on the fly by benina
- Cài đặt Blocking Queue với C++11
- Structured Exception Handling (SEH) và C++ Exception Handling khác nhau như thế nào
- Hướng dẫn sử dụng Tiếng Việt dễ dàng với VC++ 2008
- Hỏi về: Làm sao để xóa đề tài này hoặc di chuyển sang mục khác
-
12-03-2010, 07:24 PM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Tiếp tục đi bác TQN, học được mấy cái này dù mình code tầm bậy nó cũng optimize cho mình đỡ phải ngồi optimize source code. Nhưng theo tui biết optimize mã binary sau khi biên dịch của VC lại kém hiệu quả hơn BC. Hiệu quả ở đây là size và speed. Vì vậy Olly được viết trong BC (hay TC gì đó ko nhớ rõ) là vì lý do đó.
Thanz u for advance.
Benina
-
22-03-2010, 05:01 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
OllyDbg được viết = Borland C++ Builder 5 Free Compiler (bcc55.exe). Oleg, tác giả của OllyDbg không có VS (và không mua) nên phải dùng đồ free. Ở nước ngoài chứ có phải VN mình đâu anh Be, đồ gì cũng có, muốn VS 2010 cũng có luôn...????
Bây giờ tui mà nghe cái câu "Borland is speed" (hay "Delphi is speed") thì lại thấy ngậm ngùi, nhớ thời hoàng kim xa xưa của Borland. Từ bản Borland C++ 5.x trở về trước, tốc độ compile, link, sinh code ASM của Borland là vô địch. Nhưng giờ đây thì phải nhường bước cho VS 200x và Intel C++ compiler rồi. Code bự bà cố, sinh code dư cũng bà cố luôn.
Nhiều lúc ngồi code, RE application trên C++Builder, Delphi của Borland(CodeGear/Embraccor), tui cứ thấy bực, sinh code tệ quá, thậm chí stupid quá.
Vd tui đang re 1 app viết = C++Builder 2010 (mới nhất đấy nhé). Có 1 hàm đơn giản sau:
Mã:.text:00401880 __fastcall CurrentProcessId(void) proc near.text:00401880 ; CODE XREF: GetCurrentProcessHandle+4p.text:00401880 ; ThreadProc_2+3Fp.text:00401880 ; ThreadProc_1+19p.text:00401880.text:00401880 var_4 = dword ptr -4.text:00401880.text:00401880 push ebp.text:00401881 mov ebp, esp.text:00401883 push ecx.text:00401884 call GetCurrentProcessId ; Call Procedure.text:00401884.text:00401889 mov [ebp+var_4], eax.text:0040188C mov eax, [ebp+var_4].text:0040188F pop ecx.text:00401890 pop ebp.text:00401891 retn ; Return Near from Procedure.text:00401891.text:00401891 __fastcall CurrentProcessId(void) endp
1. Local var var_4 là thừa, tốn thêm 2 lệnh mov eax vào var_4 rồi lại var_4 vào eax (GetCurrentProcessId return value trong eax).
2. push ecx làm gì, trong khi GetCurrentProcessId là hàm void. ECX = this đi nữa thì call API function thì push làm gì, phải tốn thêm lệnh pop ecx
Nếu VC++200x compile thì code sẽ như sau (giã sử ta không cho nó inline và force create function prologue/epilogue)
Mã:push ebpmov ebp, espcall GetCurrentProcessIdpop ebpret
-
16-04-2010, 12:03 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Đang ở
- 89 Tam Trinh - Hoàng Mai - Hà Nội
- Bài viết
- 0
Mình là một người rất thích Delphi... nhưng giờ đây cũng phải chuyển sang VS...
Quả đúng là: Delphi và C++ Builder đang tụt hậu. Từ bản 8(.Net) cho đến bản 2009 rất là tệ... nhưng với bản 2010 thì có khởi sắc rất nhiều... Hi vọng là nó sẽ trở về lại thời kì vàng son của mình... Tới đây, bản 2011 sẽ có khả năng Cross Platform...
Trong VS, nếu mình thực hiện lệnh:
Mã:DWORD t1 = Gettickcount(); for(int i = 0; i < 10000000; i++) for (j = 0; j < 100000000; j ++); DWORD t2 = Gettickcount();
-
20-06-2010, 09:32 AM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi phu7o7cs
Ơ, tại sao nó lại bằng nhau nhỉ, chạy những 10tr * 100tr lần lặp cơ mà [IMG]images/smilies/Surprised.gif[/IMG]
-
20-06-2010, 02:46 PM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
@Nature Master: làm việc vô nghĩa thì có nên tạo vòng lặp đó ko?
-
23-06-2010, 06:15 PM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
À há, em ko để í thấy dấu <font color="Black">; sau for j nên tưởng
Mã:for(int i = 0; i < 10000000; i++) for (j = 0; j < 100000000; j ++) DWORD t2 = Gettickcount();
-
16-06-2011, 11:43 AM #8Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Nếu không muốn cho nó tối ưu (như mục đích của bài trên) thì
...trong cái command để build dùng /Od thì phải
-
16-06-2011, 04:23 PM #9Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
VC++ 200x có một khoản chưa bằng ICC và GCC, đó là khử biểu thức chung (common expression elimination). Vì thế những đoạn code mà có nhiều biểu thức chung như
Mã:x = a + b + c + d;y = a + b + c;z += a + b;t -= a + b + d + e;u *= a + b + e;...
Hi vọng VC++ 2010 sẽ cải thiện luôn khoản này.
Với sự đa dạng và phong phú về mẫu mã và giá cả, choxeonline.vn hứa hẹn sẽ là địa chỉ tin cậy cho những ai đang tìm kiếm chiếc xe ô tô ưng ý. Từ những mẫu xe hạng sang đến những chiếc xe gia đình...
Khám Phá Đa Dạng Sản Phẩm Xe Ô Tô...