-
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:
- Hướng Dẫn Viết COM Server bằng VS 2008
- Lập trình mạng trong Visual C++ 6, xây dựng ứng dụng client server đơn giản
- Chỗ Cài Phần Mềm Cad Tận Nơi Chuyên Nghiệp Q 6
- Hook – Ví dụ nhỏ dành cho "người mù"
- Tiệm Sửa PC Bàn Uy Tín Q. 10 Tại Nhà
- Hướng dẫn tạo đồng hồ chạy ngược bằng VC++ 6.0 MFC
- Hướng dẫn viết một chương trình chạy nền bằng VC++
- Thuật toán PCA trong vấn đề nhận dạng ảnh
- Phần mềm 4Gb patch cho 32bit App. How Do They Do It?
- Memory tracker
-
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
Pallet nhựa Long An đã trở thành một trong những lựa chọn phổ biến cho nhu cầu vận chuyển và lưu trữ hàng hóa trong nhiều ngành công nghiệp. Với đặc tính nhẹ nhàng, chắc chắn và dễ vận chuyển, các...
Thanh lý pallet nhựa Long An giá rẻ