Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 5 của 5
  1. #1
    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/
    So sánh thứ nhất, là việc gọi hàm.

    Của VC++ ( không compile ở chế độ tối ưu)


    Mã:
    push eax ; đối số 1mov ecx, [local.1] ; đối số 2push ecxcall F
    Của DEV C++


    Mã:
    mov DWORD PTR SS:[esp+4], eax ; đối số 1mov ecx, [local.1] ; đối số 2mov DWORD PTR SS:[esp], ecxcall F
    Như trên, VC++ đã tối ưu việc gọi hàm bằng cách tận dụng PUSH thanh ghi, mà không phải MOV dữ liệu từ thanh ghi vào vùng nhớ của stack.

    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);
    Và sau khi compile với VC++ ( lần này để chế độ tối ưu ) và DEV C++ :



    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
    Một số thông tin về tác giả :


    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.

  2. #2
    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;
    ta thấy ở đây gcc tính ngay giá trị của s ở compile-time chứ không cần vòng lặp.
    - 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;}
    Ở đây thì nó bỏ qua luôn cả phần sau, bởi vì việc tính s, in ra là điều không cần thiết.

  3. #3
    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


  4. #4
    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

  5. #5
    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

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •