Hiển thị kết quả từ 1 đến 6 / 6
  1. #1
    Tham gia
    27-04-2004
    Bài viết
    116
    Like
    0
    Thanked 0 Times in 0 Posts

    Phuơng pháp truy cập mảng nào nhanh hơn?

    Các bạn cho mình hỏi, cách truy nhập mảng nào dưới đây nhanh hơn:
    int a[20000]; //khai báo mảng
    /*Cách 1*/
    for (int i = 0; i < 20000; ++i)
    {
    a[i] = 0;
    }
    /*Cách 2*/
    for (int i = 0; i < 20000; ++i)
    {
    *(a + i) = 0;
    }
    (Sao mình không thụt đầu dòng vào được nhỉ?)
    Được sửa bởi buimanhhung lúc 16:34 ngày 27-05-2008
    Quote Quote

  2. #2
    Tham gia
    04-02-2003
    Location
    Ho Chi Minh
    Bài viết
    35
    Like
    0
    Thanked 1 Time in 1 Post
    Truy cập = địa chỉ chắc là nhanh hơn rồi. Tui cho là cách 2 nhanh hơn.

  3. #3
    Tham gia
    16-05-2008
    Bài viết
    25
    Like
    0
    Thanked 0 Times in 0 Posts
    Cách 2 thường nhanh hơn, nhưng cũng còn tùy trình dịch.

    Ngoài ra cách viết của bạn cũng không thật hoàn toàn con trỏ cho lắm nên chưa chắc đã nhanh nhất. Có thể tham khảo cách viết thuần con trỏ hơn như sau:

    for(int *p=a,*e=a+20000; p<e; p++)
    {
    *p = 0;
    }

    Nhưng thật ra cách viết chắc chắn nhanh nhất (và cũng gọn nhất) là dùng hàm thư viện chuẩn của C. Bình thường các hàm này được tối ưu rồi nên khó mà viết mã địch được nó về tốc độ. Ví dụ:

    memset(a, 0, 20000*sizeof(int));

  4. #4
    Tham gia
    15-09-2004
    Bài viết
    14
    Like
    0
    Thanked 0 Times in 0 Posts
    Đã có ai test thử xem tốc độ như thế nào chưa? Máy ko còn cài C lên ko test được.

  5. #5
    Tham gia
    16-05-2008
    Bài viết
    25
    Like
    0
    Thanked 0 Times in 0 Posts
    @buimanhhung: Xem kỹ lại thì thực ra cách 1 và 2 của bạn chỉ là 1 thôi mà. Hầu hết các chương trình dịch đều cho mã hai cách này như nhau. Do vậy hai cách này không có cái nào hơn cái nào đâu. Cách viết thuần con trỏ trong bài của tôi trên mới có cơ may nhanh hơn.

    @chiati: test mấy cái mã kiểu này trông thế mà rất khó đấy vì tốc độ hơn kém nhau không đáng kể (nên nếu không quá cầu kỳ thì nên bỏ qua, viết sao cho tiện là được). Phải đặt vòng lặp thật lớn và phải làm đi làm lại hàng chục lần mới có kết quả tương đối. Thường thì chạy cả phút mới lệch nhau vài mili giây (trong khi phép đo mili giây trong máy tính không được tin cậy lắm).
    Được sửa bởi verbway lúc 11:24 ngày 28-05-2008 Reason: Bổ sung bài viết

  6. #6
    Tham gia
    24-12-2004
    Location
    Sài Gòn
    Bài viết
    197
    Like
    0
    Thanked 1 Time in 1 Post
    Quote Được gửi bởi buimanhhung View Post
    Các bạn cho mình hỏi, cách truy nhập mảng nào dưới đây nhanh hơn:
    int a[20000]; //khai báo mảng
    /*Cách 1*/
    for (int i = 0; i < 20000; ++i)
    {
    a[i] = 0;
    }
    /*Cách 2*/
    for (int i = 0; i < 20000; ++i)
    {
    *(a + i) = 0;
    }
    (Sao mình không thụt đầu dòng vào được nhỉ?)
    a[i] và *(a+i) vẫn chỉ là một biểu thức nên không có cái nào nhanh hơn cả.

    Tuy nhiên, tổng quát mà nói thì đối với các compiler thông minh ngày nay, số học chỉ số dễ xử lý và dễ tối ưu hóa hơn số học con trỏ. Nên tư duy bằng phép tính cộng trừ trên con trỏ nói chung là không nên dùng nữa (tất nhiên trừ phi nó dẫn đến mã nguồn sáng sủa hơn, dễ đọc hơn). Tư duy bằng mảng và chỉ số được khuyến khích hơn. Như vậy tiến bộ của kỹ thuật dịch đã làm cho tình hình đảo ngược hoàn toàn so với khoảng 20 năm trước.

    Xin mở ngoặc nói thêm: số học con trỏ là một trong những lí do khiến một số người coi C/C++ là đã hoặc đang mất ngôi vô địch về tốc độ trong các ngôn ngữ lập trình.
    Được sửa bởi quynhlan lúc 12:13 ngày 28-05-2008

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • 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
  •