2009-03-02 19 views
15

Tôi đang sử dụng khá nhiều STL trong hiệu suất mã C++ quan trọng trong cửa sổ. Một cách "rẻ tiền" có thể có được một số hiệu suất phụ sẽ là thay đổi thành một thư viện STL nhanh hơn.Chuyển từ Microsofts STL sang STLport

Theo điều này, post STLport nhanh hơn và sử dụng ít bộ nhớ hơn, tuy nhiên nó chỉ mới vài năm.

Có ai thực hiện thay đổi này gần đây và kết quả của bạn là gì không?

Trả lời

15

Tôi chưa so sánh hiệu suất của STLPort với MSCVC nhưng tôi sẽ ngạc nhiên nếu có sự khác biệt đáng kể . (Trong chế độ phát hành của khóa học - xây dựng gỡ lỗi có thể là khá khác nhau.) Thật không may là liên kết bạn cung cấp - và bất kỳ so sánh nào khác tôi đã thấy - quá nhẹ về chi tiết để hữu ích.

Trước khi cân nhắc việc thay đổi nhà cung cấp thư viện chuẩn, tôi khuyên bạn nên cấu hình mạnh mã của mình để xác định vị trí tắc nghẽn. Đây là lời khuyên chuẩn; luôn luôn hồ sơ trước khi thử bất kỳ cải tiến hiệu suất nào!

Ngay cả khi hồ sơ không tiết lộ các vấn đề về hiệu suất trong các thư viện chuẩn hoặc thuật toán tôi khuyên bạn trước tiên hãy phân tích cách bạn đang sử dụng chúng. Cải tiến thuật toán và lựa chọn vùng chứa thích hợp, đặc biệt là xem xét chi phí Big-O, là nhiều hơn nữa có khả năng mang lại lợi nhuận cao hơn về hiệu suất.

+0

Đến đây với cùng một vấn đề. Trên thực tế xem xét rằng trong VS2010 bạn không có bản đồ bộ băm và tất cả các công cụ khác được giới thiệu vào năm 2005-2007 từ TR1, sự khác biệt có thể là của O (1) so với O (N) .... – ntg

0

Tôi chưa thử, nhưng theo như tôi biết, không có thay đổi lớn nào đối với việc thực thi STL của Microsoft. (Không có tối ưu hóa lớn mới trong trình biên dịch VS2008 trên 2005 hoặc) Vì vậy, nếu STLPort là nhanh hơn sau đó, nó có lẽ vẫn là trường hợp.

Nhưng đó chỉ là suy đoán. :) Hãy chắc chắn báo cáo lại kết quả nếu bạn dùng thử.

-3

Một lợi ích của stlport là nguồn mở của nó.

+0

đúng, nhưng không liên quan đến câu hỏi – 0xC0DEFACE

+16

Tôi tự hỏi làm thế nào bạn thậm chí có thể tạo một triển khai STL nguồn đóng – jalf

+2

Dễ dàng như không thêm giấy phép nguồn mở vào tệp tiêu đề. Hãy nhớ rằng nguồn mở đề cập đến việc cấp phép, không cho dù bạn có thể đọc nguồn hay không ... – Benj

5

Trong một dự án tôi làm việc trên đó làm cho sử dụng khá nặng của stl, chuyển sang STLport dẫn đến việc hoàn thành công việc trong một nửa thời gian thực hiện với triển khai STL của Microsoft. Nó không có bằng chứng, nhưng đó là một dấu hiệu tốt về hiệu suất, tôi đoán. Tôi tin rằng đó là một phần do hệ thống quản lý bộ nhớ tiên tiến của STLport.

Tôi nhớ đã nhận được một số cảnh báo khi thực hiện thay đổi này, nhưng không có gì không thể hoạt động nhanh. Như một nhược điểm, tôi muốn thêm rằng gỡ lỗi với STLport là ít dễ dàng với trình gỡ lỗi của Visual Studio hơn với STL của Microsoft (Cập nhật: có vẻ như có một cách để giải thích cho trình gỡ rối cách xử lý các container STLport, cảm ơn Jalf!).

Phiên bản mới nhất quay trở lại tháng 10 năm 2008 để vẫn có những người làm việc trên đó. Xem here để tải xuống.

+4

Giới thiệu về gỡ lỗi, không phải chỉ là vấn đề thiết lập trình hiển thị phù hợp cho trình gỡ rối? http://stlport.svn.sourceforge.net/viewvc/stlport/trunk/STLport/etc/autoexp.dat?revision=HEAD – jalf

+0

Tuyệt vời! Tôi sẽ thử xem ! –

+1

Bạn có thể định lượng báo giá "một nửa thời gian" của mình không? Tôi có đúng khi giả sử bạn đang sử dụng bản phát hành bản phát hành không? Bạn đang làm gì vậy? – MattyT

3

Nếu bạn sử dụng STLPort bạn sẽ bước vào một thế giới mà tất cả các thư viện của bên thứ ba STL-based bạn sử dụng sẽ phải được biên dịch lại với STLPort cũng như để tránh các vấn đề ...

STLPort không có một chiến lược bộ nhớ khác nhau , nhưng nếu đây là nút cổ chai của bạn thì đường dẫn hiệu suất của bạn đang thay đổi phân bổ (chuyển sang Hoard chẳng hạn), không thay đổi STL.

+0

stlport có thể được cấu hình để được sử dụng kết hợp với stl. Nó chỉ có nghĩa là bạn phải cố ý hơn trong việc sử dụng nó hơn là nó chỉ là một sự thay thế. – 0xC0DEFACE

9

Trước khi thực hiện chuyển đổi, đảm bảo kiểm tra thư viện MS (trên thực tế, Dinkumware) đã bị tắt checked iterators.Đối với một số lý do kỳ lạ, chúng được bật theo mặc định ngay cả trong bản phát hành bản phát hành và điều đó tạo ra sự khác biệt lớn khi nói đến hiệu suất.

+0

Điểm rất tốt, điều đó tạo nên sự khác biệt nghiêm trọng. Tôi đã vô hiệu hóa bản thân mình, nhưng đó có thể là lý do có một sự tăng tốc trong bài đăng trên blog mà tôi đã đề cập trong bài đăng của mình. – Laserallan

6

Gần đây, chúng tôi đã thực hiện tác vụ ngược lại. Ứng dụng của chúng tôi là một chương trình máy chủ C++ đa nền tảng và nó được xây dựng trên Windows với VS 2008 (x86) và trên HP-UX ia64 và Linux với gcc 4.3. Trên mọi nền tảng, chúng tôi đã sử dụng STLport 5.1.7 làm thư viện STL và Boost 1.38.

Để so sánh hiệu suất một thời gian trước, chúng tôi cũng đã xây dựng ứng dụng mà không cần STLport và sau đó chúng tôi đo hiệu suất.

Sau đó trên Windows, hiệu suất trở nên tốt hơn một chút. Vì vậy, chúng tôi đã chọn ngừng sử dụng STLport với VS 2008 và sử dụng thư viện STL mặc định VS 2008.

Trên HP-UX ia64 có hiệu suất giảm 20%. Caliper (trình biên tập HP-UX) cho thấy rằng các bài tập chuỗi mất nhiều thời gian hơn. Và bên trong việc gán chuỗi trong thư viện STL mặc định của gcc có các lệnh gọi tới pthread_mutex_unock. Theo như tôi biết pthread_mutex_lock/pthread_mutex_unlock được sử dụng vì thư viện STL mặc định của gcc sử dụng các chuỗi COW. Trong ứng dụng của chúng ta, chúng ta thực hiện rất nhiều phép gán chuỗi và kết quả là các chuỗi COW mà chúng ta có được hiệu suất tồi tệ hơn. Vì vậy, chúng tôi vẫn sử dụng STLPort trên HP-UX với gcc.

5

tôi đã thực hiện hoàn toàn trái ngược với năm ngoái và đây là lý do:

  • StlPort được cập nhật rất hiếm (như xa như tôi biết chỉ có một nhà phát triển đang làm việc trên đó, bạn có thể có một cái nhìn tại cam kết của họ history)
  • Sự cố khi xây dựng nó bất cứ khi nào bạn chuyển sang phiên bản Visual Studio mới. Bạn đợi tệp mới tạo hoặc bạn tự tạo nó nhưng đôi khi bạn không thể xây dựng nó vì một số tùy chọn cấu hình mà bạn đang sử dụng. Sau đó, bạn chờ đợi cho họ để làm cho nó xây dựng.
  • Khi bạn gửi báo cáo lỗi bạn chờ đợi mãi mãi, vì vậy về cơ bản không có hỗ trợ (có thể nếu bạn thanh toán). Bạn thường tự sửa chữa nó, nếu bạn biết làm thế nào.
  • STL trong Visual Studio có checked iteratorsdebug iterator support tốt hơn nhiều so với trong StlPort. Đây là nơi mà hầu hết các sự chậm lại đến từ đặc biệt là trong gỡ lỗi. Kiểm tra vòng lặp được kích hoạt trong cả hai gỡ lỗi và phát hành và điều này không phải là một cái gì đó mọi người đều biết (bạn phải vô hiệu hóa chúng mình).
  • STL trong Visual Studio 2008 SP1 đi kèm với TR1 và bạn không có điều này trong StlPort
  • STL trong Visual Studio 2010 sử dụng tham chiếu rvalue từ C++ 0x và đây là nơi bạn nhận được lợi ích hiệu suất thực.