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?
Trả lời
boost::array
(hoặc C++ 0x's std::array
) phải nhanh hơn std::vector
vì boost::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ợpboost::array
có thể đắt hơn nhiều; theo thứ tự sao chépn
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ể.
Â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
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ị.) –
@ypnos: Đúng vậy. – Puppy
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!
array
và vector
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.
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
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 đề). –
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.
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
- 1. Android nhận được tăng tốc chuẩn hóa
- 2. Cython có thể tăng tốc mảng lặp đối tượng không?
- 3. Tăng tốc các vùng và nhập mysql
- 4. Tốc độ nào nhanh hơn? Hằng số, Biến hoặc Mảng biến
- 5. Vectơ, cấu trúc và tiêu chuẩn :: tìm
- 6. Tốc độ truyền tải của RabbitMQ tăng tốc?
- 7. Tăng tốc độ runhaskell
- 8. Tốc độ nào nhanh hơn, XPath hoặc Regexp?
- 9. Tốc độ nào nhanh hơn, EXISTS trước hoặc sau INSERT?
- 10. Tốc độ nào nhanh hơn: Union hoặc Concat?
- 11. tăng tốc Eclipse trên OSX
- 12. translate3d vs css left/top và tăng tốc phần cứng
- 13. Nhanh hơn javac/kiến?
- 14. Cách tốt hơn/nhanh hơn để điền vào một mảng lớn trong C#
- 15. Tại sao mảng UInt16 có vẻ nhanh hơn mảng int?
- 16. Tốc độ PHP: tốc độ nhanh hơn là gì? if (isset ($ foo)) HOẶC nếu ($ foo == true)
- 17. Android ffmpeg và tăng tốc phần cứng
- 18. Làm cách nào để tăng tốc nhân bản mảng trong C#?
- 19. Python có nhanh hơn và nhẹ hơn C++ không?
- 20. Tại sao chuỗi nối lại nhanh hơn mảng tham gia?
- 21. Các câu lệnh chuẩn bị không nên nhanh hơn nhiều?
- 22. Nhanh hơn String.Replace()
- 23. Tăng tốc phần cứng Java
- 24. Sự khác biệt giữa File.renameTo và Files.move: Tốc độ nào nhanh hơn?
- 25. Tăng tốc độ sqlFetch()
- 26. Cuộn theo chương trình UITableView với khả năng tăng tốc và giảm tốc
- 27. tăng tốc sql INSERTs
- 28. Trọng lực với đường truyền, khả năng tăng tốc và tốc độ đạt được
- 29. Boost IO Stream và ZLib tăng tốc độ
- 30. Java - Thay thế nhanh hơn cho Math.pow() và Math.sqrt()
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
@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
@Roman: Sau đó, bạn nên biết hồ sơ. – GManNickG