2015-03-03 18 views
10

Hôm nay tôi đã tải xuống và tạo một dự án mẫu về triển khai STL của Electronic Arts và vector của EA trông chậm hơn nhiều so với tiêu chuẩn. Tôi chỉ cần tạo 2 vectơ và tải chúng lên với 1 triệu các mặt hàng:Hiệu suất EASTL

void performance_test(void) 
{ 
    clock_t start; 
    clock_t end; 


    // EA 

    eastl::string strEA = "hello"; 
    eastl::vector<eastl::string> vec_EA; 

    start = clock(); 
    for (size_t i = 0; i < 1000000; i++) 
    { 
     vec_EA.push_back(strEA); 
    } 

    end = clock(); 
    printf("EA  %f\n", (double(end - start)/1000)); 

    // Standard 

    std::string strStandard = "hello"; 
    std::vector<std::string> vec_Standard; 

    start = clock(); 
    for (size_t i = 0; i < 1000000; i++) 
    { 
     vec_Standard.push_back(strStandard); 
    } 

    end = clock(); 
    printf("Standard %f\n", (double(end - start)/1000)); 
} 

Và kết quả là:

  1. EA 0,759000
  2. Chuẩn 0,064000

Vì vậy, là có bất cứ điều gì những gì tôi đang làm sai hoặc tôi chỉ bỏ lỡ một cái gì đó? Mẫu đã được biên dịch với bộ công cụ nền tảng v100.

+0

Tại sao bạn gắn thẻ C? Thư viện chuẩn của trình biên dịch có thể được tối ưu hóa đặc biệt cho trình biên dịch đó. Tôi không chắc liệu nó có phải là thứ tự độ lớn không. Bộ công cụ nền tảng v100 là gì? –

+2

Tôi không chắc mình sẽ tin 'đồng hồ' cho thời gian, nhưng khi sự khác biệt là tuyệt vời thì nó sẽ ổn thôi. Nó sẽ là giá trị cố gắng một vector EASTL với một chuỗi tiêu chuẩn và ngược lại, để thu hẹp vấn đề. –

+0

@MarkRansom: Hmm. Vector của EA với chuỗi chuẩn nhanh hơn vector chuẩn, nhưng chuỗi không được nhanh hơn? – CsOkemf

Trả lời

11

Khi tôi chạy benchmark của bạn với một thông cáo xây dựng trong VS 2010, tôi nhận được kết quả tương tự với những gì người ta có thể hy vọng cho:

EA  0.063000 
Standard 0.073000 

Tuy nhiên, khi tôi chạy việc phát hành cùng xây dựng dưới sự debugger VS, các kết quả thay đổi đáng kể:

EA  1.293000 
Standard 0.080000 

Và phải mất nhiều hơn (hàng chục giây) cho bất kỳ việc dọn dẹp đối tượng nào xảy ra. Xin lưu ý - đây là cùng một bản phát hành chế độ phát hành, không phải là bản dựng gỡ lỗi.

Tôi chưa xem xét lý do tại sao EASTL bị ảnh hưởng nghiêm trọng bởi môi trường trình gỡ lỗi. Tôi giả sử nó có một cái gì đó để làm với đống gỡ lỗi.


Cập nhật (04 tháng 3 2015):

Một chi tiết có ảnh hưởng đến kết quả là chiều dài của chuỗi liên quan. VS sử dụng 'tối ưu hóa chuỗi ngắn' trong std::string sẽ giảm số lượng phân bổ xảy ra đối với các đối tượng chuỗi có giá trị như "hello". Nếu bạn thay đổi giá trị khởi tạo cho các dây sử dụng trong ví dụ "hello"-"hello - but not too short", bạn sẽ nhận được kết quả tương tự như sau:

// release build, run outside of the debugger 
EA  0.078000 
Standard 0.113000 

// release build, run under the debugger 
EA  0.762000 
Standard 1.414000 

Và bây giờ nó trở nên rõ ràng rằng thứ tự của sự khác biệt tầm quan trọng khi chuẩn là chạy theo trình gỡ lỗi có khả năng là do đống gỡ lỗi dành nhiều thời gian theo dõi phân bổ bộ nhớ chuỗi.

+0

Hmm, bạn có thể chia sẻ toàn bộ giải pháp không? Có lẽ tôi đã có một cài đặt trình biên dịch khác. – CsOkemf

+0

'git clone https: // github.com/mburr/eastl-test.git' sau đó mở giải pháp VS2010 trong' eastl-test \ vs2010-test \ eastl-test \ eastl-test.sln'. Bạn cũng có thể muốn đọc 'eastl-test \ vs2010-test \ README-vs2010-test.txt' –

+0

Cảm ơn bạn rất nhiều, bây giờ tôi chắc chắn có điều gì đó sai với cài đặt của tôi. Bây giờ tôi nhận được kết quả của bạn. – CsOkemf