2011-10-24 27 views
15

Xin lỗi cho another internet forum quote, nhưng tôi nghĩ rằng đây là thú vị và muốn hỏi:Boost/STL có chậm đối với tính toán hiệu suất cao không?

C++ là nhanh hơn nếu bạn chuck "an toàn" tính năng của chương trình ngôn ngữ và tránh những thứ như STL, và Tăng. Trong byte thô thành byte C++ nhanh hơn, nhưng sau đó lại là C.

Thời điểm bạn thêm hành lý của STL và Boost bạn chậm hơn cũng được viết mã C#. Lợi thế là J # CIT và Java jit có là những tính năng an toàn đó cũng được tối ưu hóa tốt. Tính năng an toàn C++ dựa vào tối ưu hóa trình biên dịch.

Vì vậy, nếu bạn không cẩn thận với STL của mình và mã Boost, bạn sẽ có một con vịt què của một ứng dụng.

Tôi đồng ý về việc thoát khỏi các tính năng an toàn, nhưng tôi đã thấy rất nhiều quảng cáo việc làm tần suất cao và tất cả đều yêu cầu trải nghiệm Tăng cường. Chắc chắn Boost không thể là thứ tồi tệ để sản xuất mã nhanh? Hoặc là người này chỉ đơn thuần là nói về mặt lý thuyết nếu bạn chỉ đơn giản là thao tác ở cấp độ byte nó sẽ nhanh hơn?

Chỉnh sửa: Trích dẫn về STL và Boost, do đó tôi đã thêm thẻ STL.

+41

Ai nói rằng không biết những gì ông đang nói về. –

+5

Không đồng ý rằng STL hoặc BOOST làm cho bạn chậm hơn. Xem: http://stackoverflow.com/questions/3664272/stdvector-is-so-much-slower-than-plain-arrays/3664349#3664349 –

+1

Đừng quên rằng trong quảng cáo việc làm, có thể họ đang tìm kiếm nhiều hơn cho mọi người người viết * đúng * mã đầu tiên, với hiệu suất là mối quan tâm thứ cấp (mặc dù vẫn quan trọng). –

Trả lời

22

Không

tăng và các thư viện chuẩn C++ được sử dụng để sản xuất triển khai sản xuất cực kỳ nhanh chóng. Tất nhiên, người ta có thể cải thiện khi triển khai trong các trường hợp cụ thể - điều này tương tự với việc viết trình phân bổ của riêng bạn khi bạn biết cách thực thi khác với các trình phân bổ mục đích chung và cách tối ưu hóa cho việc sử dụng đó. Vì vậy, một trong những khóa học có thể phân tích vấn đề và sản xuất một thực hiện tối ưu hóa đó là nhanh hơn so với việc thực hiện mục đích chung (hoặc tăng).

Tất nhiên, bất kỳ thư viện nào cũng có thể bị lạm dụng, điều này có thể dẫn đến việc thực thi bị xâm phạm. Ngắn gọn của nó là tăng cường (một bộ sưu tập lớn các thư viện) triển khai là một điểm khởi đầu tuyệt vời cho việc triển khai nhanh. Nếu bạn cần nó nhanh hơn tăng cường, hãy xác định vấn đề và cải thiện nó.

Nhiều nhà phát triển C++ quan tâm đến hiệu suất; nói chung, nhiều hơn các ngôn ngữ khác. tăng cường nói chung cũng được xem xét, đánh giá ngang hàng, và việc triển khai được sử dụng để kiểm tra và hình thành cơ sở cho các tính năng thư viện chuẩn.

-----

Cảm ơn để Justin đã cho tôi chia sẻ câu trả lời của mình về vấn đề đóng: - Seth

Khá điều ngược lại.

Tăng cường là không về dây an toàn.

Boost là về mức cao thành phần phần mềm, với một cao mức trừu tượng này tránh sự thông thường 'thư viện lock-in' nhìn thấy với các khuôn khổ khác/thư viện .

Ví dụ: thư viện Boost Graph của bạn không không yêu cầu bạn chuyển đổi cấu trúc dữ liệu: bạn có thể sử dụng/điều chỉnh bất kỳ cấu trúc dữ liệu nào hoạt động tốt cho ứng dụng của bạn. Trong trường hợp xấu nhất, bạn có thể phải viết một đặc điểm lớp để giúp Tăng cường với việc giải thích; Đó chính xác là đặc điểm này (chung với thư viện mẫu hiện đại) khiến Boost hoạt động như không có gì khác trong thực tế: sẽ không có nhiều không phù hợp với thư viện trở kháng. Điều này phù hợp trực tiếp với các khái niệm mới của C++ 11 xung quanh luồng và di chuyển ngữ nghĩa: ngăn chặn ngay cả các trường hợp sao chép dữ liệu cơ bản nhất.

Ngoài ra, tất cả các thư viện này đều tôn trọng triển khai cấp phát của riêng bạn, cho phép hiệu suất quản lý bộ nhớ vượt trội. Bạn có thể căn chỉnh vectơ int 128 bit trong C# - nhưng bạn sẽ phải nhảy qua nhiều vòng lặp và, có không có cách nào bạn có thể làm cho nó hoạt động với API của khung công tác.

Trong C++, bạn chỉ trả tiền cho những gì bạn sử dụng và Boost hoàn toàn theo tinh thần đó.

Mmmm Tôi nghĩ rằng tôi chưa hoàn toàn nhấn mạnh đến mức đủ, nhưng bây giờ tôi đã xong.

Hãy để tôi gần bằng cách nhìn vào nó từ phía bên kia: trong C# thì khó viết mã trình diễn nhiều hơn, bởi vì khó có thể nhìn thấy những gì đang diễn ra đằng sau hậu trường.

Khi bạn thả đằng sau hậu trường (chế độ không an toàn, IL đang), bạn sẽ cho là ít an toàn hơn so với C++, bởi vì trong C++ có một chính sách minh bạch về những gì xảy ra ở đâu và như thế nào. Trong C# bạn thậm chí không thể tin tưởng một int* mà bạn đã có một dòng trước (vì Garbage Collector có thể đã di chuyển pho mát của bạn); Không có gì cho biết trình biên dịch và động cơ JIT nào sẽ tạo mã chung tốt đẹp của bạn .

Tóm lại: bạn có thể viết mã không đúng ở bất cứ đâu, nhưng Boost không thể đổ lỗi. STL chỉ có thể được đổ lỗi cho hiệu suất thô điên rồ .

poco, Qt, MFC, WTL, không có điều gì ....

Mono SIMD

Bao gồm rất nhiều lĩnh vực mà gần gũi với thảm hại và vi phạm 'Nguyên tắc Of Least Surprise' trong một cách lớn (example coming when blog back online)

Đó std::copy sẽ tĩnh dịch trong việc thực hiện tốt nhất dựa trên SSE4, MOVSW hoặc chỉ đơn giản memcpy mà tiền có thể mua, và bạn thậm chí không cần phải viết một lá thư khác nhau từ việc sao chép một istream đến một set, để nói.

+0

Tôi có thể mượn một chỗ cho câu trả lời đã viết của mình không? Tôi ghét chỉ thả nó vào thùng rác :) – sehe

+0

@ tôi không hiểu tại sao không. hãy tiếp tục, nhưng hãy thêm ghi chú vào câu trả lời của bạn trong câu trả lời để tránh nhầm lẫn =) – justin

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