Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: So sánh tốc độ giữa i++ và ++i.

  1. #1
    Ngày gia nhập
    04 2008
    Nơi ở
    Bốn bề là nhà
    Bài viết
    697

    Mặc định So sánh tốc độ giữa i++ và ++i.

    Có 2 cách viết vòng lặp for.
    C++ Code:
    1. for (int i = 0; i < X; i++)
    2. {
    3.      //do something
    4. }

    C++ Code:
    1. for (int i = 0; i < X; ++i)
    2. {
    3.       // do something
    4. }

    Mình có dạo qua 1 số forums và thấy có vài nhận định rằng việc dùng ++i trong vòng lặp sẽ thực hiện nhanh hơn.
    Nhưng chưa có lý giải nào mình cảm thấy thuyết phục.
    Bạn nào biết về vấn đề này có thể giải đáp giúp mình được không?
    Thanks in advance!

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi G.Perelman Xem bài viết
    Có 2 cách viết vòng lặp for.
    C++ Code:
    1. for (int i = 0; i < X; i++)
    2. {
    3.      //do something
    4. }

    C++ Code:
    1. for (int i = 0; i < X; ++i)
    2. {
    3.       // do something
    4. }

    Mình có dạo qua 1 số forums và thấy có vài nhận định rằng việc dùng ++i trong vòng lặp sẽ thực hiện nhanh hơn.
    Nhưng chưa có lý giải nào mình cảm thấy thuyết phục.
    Bạn nào biết về vấn đề này có thể giải đáp giúp mình được không?
    Thanks in advance!
    Đối với biến int thì chẳng khác biệt gì hoặc hầu như không khác biệt
    Nhưng khi dùng các kiểu khác (kiểu đối tượng như iterator chẳng hạn) thì có thể khác biệt lớn đấy ^^
    Với cả dù ++i không nhanh hơn thì cũng không chậm hơn
    Mà chắc là nếu chưa thì cũng sẽ có lúc phải làm việc với iterator. Nên chẳng tội gì không tạo thói quen dùng chỉ dùng 1 kiểu ++i cho thống nhất cả

  3. #3
    Ngày gia nhập
    12 2009
    Nơi ở
    bế quan tu lại
    Bài viết
    846

    theo tài liệu đính kèm thì các toán tử prefix dạng -- i hoặc ++ sẽ thực hiện nhanh hơn postfix i -- hoặc i ++ do toán tử prefix tăng giá trị của biến trước sau đó trả kết quả về cho biểu thức, trong khi toán tử postfix phải lưu giá trị cũ vào 1 biến tạm, tăng giá trị của biến và trả về giá trị của biến tạm
    Attached Files Attached Files

  4. #4
    Ngày gia nhập
    04 2008
    Nơi ở
    Bốn bề là nhà
    Bài viết
    697

    Tớ vẫn chưa thực sự hiểu tại sao thằng postfix cần phải dùng biến tạm, trong khi prefix thì không?
    Thông cảm nếu câu hỏi ngờ nghệch.

  5. #5
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi G.Perelman Xem bài viết
    Tớ vẫn chưa thực sự hiểu tại sao thằng postfix cần phải dùng biến tạm, trong khi prefix thì không?
    Thông cảm nếu câu hỏi ngờ nghệch.
    Vì prefix trả về giá trị sau khi đã tăng
    Còn postfix trả về giá trị trước khi tăng, nên phải lưu giá trị đó lại, chờ tăng biến xong mới trả về.

    Thường 2 operator ++ cho 1 đối tượng sẽ được implement với dạng như sau:
    A& A::operator++() {...; return *this;} // prefix
    A A::operator++(int) {A temp(*this); ++*this; return temp;} // postfix

    Khi dùng với biến int thì thường compiler sẽ optimize được để 2 trường hợp ra code hoàn toàn giống nhau. Hoặc nếu phải lưu thì cũng chỉ mất 1 lệnh copy thanh ghi, không đáng kể.
    Với các kiểu đối tượng iterator phức tạp thì chi phí cho việc tạo đối tượng tạm và copy đối tượng sẽ là đáng kể. Các iterator đơn giản như iterator của std::vector, std::map thì với mức optimize cao, sự khác biệt cũng chưa lớn lắm

    Nhưng logic là: prefix++ không thể tồi hơn postfix++
    Trong khi postfix++ phải tùy thuộc vào kiểu dữ liệu, vào compiler, vào mức optimization... mới có thể bằng hoặc gần bằng được prefix++
    Vậy thì sao không luôn dùng prefix++ cho đơn giản

  6. #6
    Ngày gia nhập
    04 2008
    Nơi ở
    Bốn bề là nhà
    Bài viết
    697

    Mặc định So sánh tốc độ giữa i++ và ++i.

    Tôi thắc mắc 1 vấn đề phát sinh khác: Tại sao những kiến thức cao siêu thế này bạn lại biết được?
    Nếu có bí kíp gì thì mong bạn share để anh em học hỏi.
    Hoặc nếu phải lưu thì cũng chỉ mất 1 lệnh copy thanh ghi, không đáng kể.
    Cái này thì t biết, chỉ là muốn tìm hiểu tường tận vấn đề thôi.

  7. #7
    Ngày gia nhập
    08 2011
    Bài viết
    98

    Đúng là theo lý thuyết thì ++i sẽ nhanh hơn i++ vì i++ còn phải lưu tạm vào đâu đó trước khi thực hiện các công việc khác.Nhưng thật sự khi build ra thì cả 2 y như nhau vì compiler đã optimize cả.Chả có gì khác biệt.disassembly ngay trên VS là thấy nó build như nhau rồi.Nếu dùng gcc dịch mà so sánh thì có khi check sum của 2 file nó giống nhau luôn vì VS lúc nó build thế này,lúc thì build thế khác,thành ra không giống hoàn toàn.
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

  8. #8
    Ngày gia nhập
    04 2008
    Nơi ở
    Bốn bề là nhà
    Bài viết
    697

    T nghĩ rằng nên viết theo kiểu prefix vì đâu phải compiler nào cũng optimize cho mình việc này. Như fbchicken đã nói nếu copy đối tượng phức tạp thì sự khác nhau là đáng kể.

  9. #9
    Ngày gia nhập
    01 2011
    Nơi ở
    \WINDOWS\Assembly\
    Bài viết
    54

    Trích dẫn Nguyên bản được gửi bởi G.Perelman Xem bài viết
    Có 2 cách viết vòng lặp for.
    C++ Code:
    1. for (int i = 0; i < X; i++)
    2. {
    3.      //do something
    4. }

    C++ Code:
    1. for (int i = 0; i < X; ++i)
    2. {
    3.       // do something
    4. }

    Mình có dạo qua 1 số forums và thấy có vài nhận định rằng việc dùng ++i trong vòng lặp sẽ thực hiện nhanh hơn.
    Nhưng chưa có lý giải nào mình cảm thấy thuyết phục.
    Bạn nào biết về vấn đề này có thể giải đáp giúp mình được không?
    Thanks in advance!
    Theo mình nghĩ có lẽ ++i tăng i trước nên nó sẽ nhanh hơn thay vì i++ (trả về gt trước xong rồi mới tăng)

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn