-
16-08-2012, 02:43 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
[Dịch] So sánh sự tối ưu compile giữa VC++ 2010 và DEV C++
Mình vừa lượn facebook, thấy bài báo này, của người Việt mình viết trên securityxploded.com , trang nghiên cứu bảo mật khá nổi tiếng, nhặt nhạnh về luôn [IMG]images/smilies/biggrin.png[/IMG]
Bài gốc:
Mã:http:/agareshwar.securityxploded.com/2012/08/16/compiler-optimization-features/
Của VC++ ( không compile ở chế độ tối ưu)
Mã:push eax ; đối số 1mov ecx, [local.1] ; đối số 2push ecxcall F
Mã:mov DWORD PTR SS:[esp+4], eax ; đối số 1mov ecx, [local.1] ; đối số 2mov DWORD PTR SS:[esp], ecxcall F
So sánh thứ 2, với vòng lặp đơn giản.
Có 1 đoạn code nhỏ chứa 1 vòng lặp đơn giản như thế lày :
Mã:int s;printf(“%d%d”,a,c);s=0;for (int i=3; i< a; i++) { s=s+i;}if (a <b) printf( ” Result is %d”,s);
Như trên, ta thấy 1 điều thú vị là, VC++ không sinh mã assembly cho vòng lặp for, mà nó đã tính luôn kết quả của s ở compile-time ; còn DEV C++ thì như truyền thống, sinh mã assembly cho vòng lặp for để tính s ở run-time.
Tác giả cũng nói đến 1 số kinh nghiệm trong việc tối ưu compile :
- Các biến nên được chứa trong các thanh ghi ngay khi có thể, nói cách khác, ta nên sử dụng thanh ghi nhiều nhất có thể trong việc thao tác với dữ liệu của biến, điều này giảm việc truy xuất tới bộ nhớ, tăng hiệu suất và giảm kích thước mã.
- Nên sử dụng Just-in-time.
- Xoá bỏ dead block ( nghe quen quen , mà chả biết là cái gì [IMG]images/smilies/dont_tell_anyone.gif[/IMG] )
- Xoá bỏ các lệnh NOP ( No Operation ) , giảm kích thước mã.
- Tham khảo thêm tại :
Mã:http://msdn.microsoft.com/en-us/library/k1ack8f1 http://msdn.microsoft.com/en-us/library/8f8h5cxt.aspx http://msdn.microsoft.com/en-us/library/ms241594(v=vs.80).aspx
Sieu is a security researcher from Ho Chi Minh(HCM) city, Viet Nam. He has 4 year bachelor of engineering degree in Computer Science from National University. He is now pursuing his Masters degree in France since last year. He has passion in system and network security, He is also involved in some system security, a bit of *****ing, unpacking etc. Currently he is undergoing SecurityXploded Mentorship Program for 6 months.
View more random threads:
- Sử dụng SEH để bắt lỗi hệ thống
- Hướng dẫn viết một game đơn giản trong DirectX từ A - Z
- Hướng dẫn thao tác với FTP server theo cách thủ công
- Thư Viện Hỗ trợ Hook API
- Mix code giữa .NET và WINAPI
- Ogre, Lập trình game với Ogre graphic engine
- Image Rotation
- hồn trương ba, da hàng thịt
- Một số hàm về Message
- Hướng dẫn viết một chương trình Sniffer
-
16-08-2012, 03:48 PM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Thắc mắc một vài điều sau:
- VC ở đây là phiên bản bao nhiêu ? Dev C++ có biên dịch ở chế độ tối ưu không ?
Và nên nhớ, trình dịch đi kèm với Dev C++ phiên bản mới nhất là gcc 3.4.x, trong khi gcc nay đã ra đến 4.7.2. So sánh có khập khiễng không ?
-------------------------------------------------------------
Đóng góp thêm đoạn mã asm mà g++ 4.7.2 biên dịch cái đoạn code c++ (ở chế độ tối ưu hoá -O3) trên:
- Với a > b:
Mã:4004d0: 48 83 ec 08 sub $0x8,%rsp int s; int a = 10, b = 11, c = 12; printf("%d%d",a,c); 4004d4: ba 0c 00 00 00 mov $0xc,%edx 4004d9: be 0a 00 00 00 mov $0xa,%esi 4004de: bf 94 06 40 00 mov $0x400694,%edi 4004e3: 31 c0 xor %eax,%eax 4004e5: e8 b6 ff ff ff callq 4004a0 <printf@plt> s=0; for (int i=3; i< a; i++) { s=s+i; } if (a <b) printf( " Result is %d",s); 4004ea: be 2a 00 00 00 mov $0x2a,%esi 4004ef: bf 99 06 40 00 mov $0x400699,%edi 4004f4: 31 c0 xor %eax,%eax 4004f6: e8 a5 ff ff ff callq 4004a0 <printf@plt> return 0;
- Với a > b:
Mã:int main() { 4004d0: 48 83 ec 08 sub $0x8,%rsp int s; int a = 10, b = 9, c = 12; printf("%d%d",a,c); 4004d4: ba 0c 00 00 00 mov $0xc,%edx 4004d9: be 0a 00 00 00 mov $0xa,%esi 4004de: bf 84 06 40 00 mov $0x400684,%edi 4004e3: 31 c0 xor %eax,%eax 4004e5: e8 b6 ff ff ff callq 4004a0 <printf@plt> s=s+i; } if (a <b) printf( " Result is %d",s); return 0;}
-
13-11-2012, 11:04 AM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
em dùng vs2010 dịch ở chế độ optomize for speed mà nó vẫn có vòng lặp là sao nhỉ,
khai báo ban đầu là
int s,a=10,b=2,c=16;
khi để a>b thì nó cũng ko dịch đoạn in ra, nhưng vẫn có vòng lặp
-
19-11-2012, 12:19 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Có lẽ tác giả bài viết cũng thiếu sót khi không nói rõ là sử dụng những option nào khi build bằng VC, tác giả dùng phiên bản nào của VC
Ngoài ra, cũng nên dùng gcc chứ ko nên dùng DevC++, IDE DEV C++ đã lâu rồi không còn update
-
07-01-2013, 04:38 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
mình thấy trong visual C++ bạn có thể chỉnh mức độ tối ưu mà, mặc định của nó là no optimize
Thông qua phân tích dữ liệu Google từ 86 quốc gia, mới đây, một công ty tại Anh đã công bố bảng xếp hạng kích tấc "cậu nhỏ" của các nước trên thế giới. Kết quả, hầu hết các nước xếp ở nhóm đầu của...
"Chim" của chàng trai Việt thuộc...