2011-02-14 21 views
16

Hiệu suất của boost::array so với hiệu suất của std::vector và yếu tố nào có ảnh hưởng đáng kể đến nó?Vectơ chuẩn và mảng tăng tốc: nhanh hơn?

+1

Tôi nghi ngờ rằng đây có thể là một nút cổ chai trong đơn đăng ký của bạn. – Benoit

+3

@Benoit. Tôi đang làm máy tính khoa học và tốc độ là rất quan trọng cho nó. – grzkv

+9

@Roman: Sau đó, bạn nên biết hồ sơ. – GManNickG

Trả lời

30

boost::array (hoặc C++ 0x's std::array) phải nhanh hơn std::vectorboost::array trường hợp hoàn toàn nằm trên ngăn xếp. Điều này có nghĩa là boost::array không có phân bổ đống, và điều đó cũng có nghĩa là nó không thể tăng quá kích thước bạn chỉ định cho nó khi xây dựng.

Mục đích của boost::array là để phục vụ như là một lớp mỏng xung quanh mảng nguyên thủy, vì vậy bạn có thể đối xử với họ như container tiêu chuẩn với .begin(), .end(), vv trình biên dịch tốt nên loại bỏ tất cả chi phí của boost::array như vậy mà nó thực hiện giống hệt với mảng nguyên thủy.


Tất cả điều này liên quan đến "thiết lập mặc định", nơi bạn không có trình phân bổ tùy chỉnh và bạn đo những thứ đơn giản như xây dựng mảng, truy cập và sửa đổi các yếu tố. Mặt khác, mọi thứ có thể xoay quanh trong các thử nghiệm khác, các nền tảng khác hoặc với một thiết lập thông minh. Ví dụ,

  • nếu bạn tạo một cấp phát tùy chỉnh, có lẽ có được một hồ bơi bộ nhớ lớn lúc khởi động chương trình, sau đó xây dựng hoặc thay đổi kích thước một std::vector có thể không dùng nữa là tất cả những gì đắt tiền.
  • Hoán đổi một std::vector bằng cách khác thường là hoạt động rất nhanh; tốc độ trao đổi hai con trỏ. Hoán đổi hai trường hợp boost::array có thể đắt hơn nhiều; theo thứ tự sao chép n yếu tố. Nhưng sau đó, trong C++ 0x, trong đó std::array sẽ là một phần, trao đổi hai mảng sẽ nhanh chóng trở lại, nhờ tham chiếu rvalue và ngữ nghĩa di chuyển của chúng.
  • Sao chép vectơ có thể là hoạt động rất nhanh; nhanh như sao chép một con trỏ (sao chép trên ghi). Sao chép một boost::array có thể yêu cầu sao chép từng phần tử mảng. Sau đó, một lần nữa, đôi khi sao chép bất kỳ đối tượng là rất nhanh, thậm chí nhanh hơn so với sao chép một con trỏ và thậm chí trong trình biên dịch C++ 03 của bạn - nhờ sao chép elision.

Bạn có thể xem tiểu sử để xem nhanh hơn, nhưng thậm chí thử nghiệm này sẽ chỉ cung cấp cho bạn ý tưởng về phiên bản cụ thể của trình biên dịch cụ thể trên nền tảng cụ thể.

+1

Âm thanh với tôi vì bạn không thể sử dụng boost :: array cho các kích thước mảng lớn. Nếu không, bạn có nguy cơ tràn ngăn xếp. Chính xác? – ypnos

+2

Nếu bạn phân bổ nó trên ngăn xếp, @Ypnos, sau đó có, bạn có thể mong đợi tràn ngăn xếp (hoặc lỗi trình biên dịch, nếu trình biên dịch không cho phép loại vượt quá kích thước nhất định). Nếu bạn phân bổ động, thì bạn sẽ không bị tràn ngăn xếp trừ khi bạn truyền nhầm mảng theo giá trị. (Nhưng lỗi trình biên dịch vẫn là một rủi ro, bất cứ nơi nào bạn phân bổ giá trị.) –

+0

@ypnos: Đúng vậy. – Puppy

16

Cách tốt nhất để đạt được bất kỳ kết luận nào là viết chương trình để kiểm tra hiệu suất của chúng với lượng dữ liệu khổng lồ. Làm thế nào người khác có thể đến bất kỳ kết luận?

Trong khi bạn đang ở đó, bạn có thể cần một số công cụ để hỗ trợ bạn, chẳng hạn như VTune, hoặc AMD CodeAnalyst Performance Analyzer vv Very Sleepy (công cụ miễn phí) là một C/C++ CPU profiler cho các hệ thống Windows. Bạn có thể thử chúng!

+2

+1 để đặt tên cho các công cụ – grzkv

+0

Xin chào, Rất buồn ngủ là một công cụ nhỏ đẹp! (Tôi đã sửa liên kết cho nó.) – Nate

+0

@Nate: cảm ơn đã sửa liên kết :-) – Nawaz

2

arrayvector phục vụ các mục đích hơi khác nhau. Nếu bạn khởi tạo một vector với kích thước bạn cần và nó sẽ không bao giờ được phân bổ lại, hiệu suất giữa hai là giống hệt nhau. array chỉ xử lý các mảng có kích thước tĩnh (mảng kiểu C nếu bạn muốn). vector có thể phát triển nếu bạn đẩy nhiều vật thể vào thùng chứa hơn so với dung lượng hiện tại.

+0

Vì vectơ cần truy cập dữ liệu cơ bản thông qua một con trỏ, có thể có lợi thế về hiệu suất nhỏ đối với mảng vì truy cập vectơ sẽ phải đi thông qua một cấp độ khác nữa. Tôi nghi ngờ đây là một yếu tố đáng xem xét trên phần cứng hiện đại ngoại trừ trong trường hợp cực đoan. – Ferruccio

+0

Anh ta không nói về một mảng kiểu C, anh ta đang đề cập đến lớp mẫu 'std :: array' (aka' boost :: array'), có cùng một hiệu suất chuyển hướng "hit" như một vectơ (cả hai) vì vậy, nó sẽ không thành vấn đề). –

12

Nhanh hơn vào cái gì? std::vector nhanh hơn để nhập vì nó có ít ký tự hơn.

Không quan trọng những gì nhanh hơn, bạn so sánh hai thứ khác nhau, một mảng có kích thước tĩnh với mảng động. Mà để sử dụng phụ thuộc vào ứng dụng của bạn, và không có gì để làm với tốc độ.

Bạn có muốn vận hành máy bay hoặc ô tô đến một số địa điểm không? Nó phụ thuộc vào nhiều hơn mà chỉ đơn giản là "nhanh hơn".


Có thể phân bổ nhanh hơn vì trên máy điển hình trên ngăn xếp Hoặc std::vector có thể gần như nhanh vì một số lược đồ phân bổ bộ nhớ tùy chỉnh.

Nhưng đó chỉ là phân bổ. Điều gì về sử dụng? Vâng cả hai chỉ là chỉ số thành một mảng, vì vậy có thể không khác biệt ở đó. Nhưng những gì về di chuyển hoặc trao đổi? boost::array chắc chắn không thể làm điều đó nhanh như vậy, bởi vì std::vector chỉ phải di chuyển/hoán đổi một con trỏ. Hoặc có thể không, ai biết được?

Bạn phải lập hồ sơ và xem bản lắp ráp. Không ai có thể kỳ diệu biết được mọi thứ diễn ra như thế nào cho bạn.

+0

Và nếu bạn có nhiều dữ liệu để xử lý, thời gian cần để phân bổ một 'std :: vector' có thể dễ dàng bị thay đổi bởi thời gian cần thiết để lặp qua những gì bạn đã phân bổ. Đặc biệt là nếu bạn bắt đầu thực hiện nhiều lần truyền dữ liệu. – SirGuy

Các vấn đề liên quan