2013-06-17 41 views
6

Tôi đang viết ứng dụng Máy chủ lấy dữ liệu từ nhiều nguồn cùng lúc và lưu trữ nó trong cơ sở dữ liệu nội bộ của nó (hiện tại là std::set).Hiệu suất vùng chứa PPL

Tôi vừa xem xét cấu trúc dữ liệu PRT ConcRT của Microsoft và tự hỏi hiệu quả của chúng so với cách sử dụng một mutex hạt mịn trên một số std::unordered_set. Ví dụ, có nhiều sự khác biệt về hiệu năng giữa hai đoạn mã:

void StdWithMutex(void) 
{ 
    std::ofstream outFile("Test.tmp"); 

    std::lock_guard<std::mutex> lockGuard(m_mutex); 

    // Iterate through the data and write it to a file: 
    // m_setData is of type std::unordered_set<DataType> 
    for(auto data : m_setData) 
    { 
      outFile << data; 
    } 
} 

Và:

void ConcRT(void) 
{ 
    std::ofstream outFile("Test.tmp"); 

    // Iterate through the data and write it to a file: 
    // m_setData is of type concurrency::concurrent_unordered_set 
    for(auto data : m_setData) 
    { 
      outFile << data; 
    } 
} 

Moveover, tôi thường cần in dữ liệu ra theo thứ tự, đó là lý do tôi m hiện đang sử dụng std::set như trái ngược với std::unordered_set, vì vậy nếu có được lợi ích khi sử dụng concurrency::concurrent_unordered_set, liệu hiệu suất tiềm năng có đạt được gần với chi phí sắp xếp lại dữ liệu mỗi khi cần in không?

+5

thế nào là một khóa mutex cấp lớp trong suốt thời gian một tập tin lớn-ghi hạt mịn? –

+0

Rất khó để tìm ra những gì bạn đang cố gắng đạt được ở đây. Ví dụ mã đầu tiên của bạn khóa mutex cho toàn bộ thời lượng viết ra toàn bộ tập hợp. tức là nó không đồng thời với việc đặt tập hợp. Trong ví dụ mã thứ hai của bạn, vòng lặp for trong vòng lặp for có lẽ là an toàn đồng thời, vì vậy nếu tập hợp đã được phổ biến trong khi vòng lặp for đang chạy, có lẽ vòng lặp for sẽ chỉ kết thúc nếu nó nhận được khóa và được di chuyển đến cuối trước populating thread thu được một khóa để chèn một giá trị mới. Bạn đang cố gắng đạt được điều gì? Đọc đồng thời (từ mạng) ghi (vào đĩa)? –

Trả lời

1

Có sự khác biệt lớn. Cố gắng chạy 100 luồng song song bằng văn bản và đọc từ vùng chứa này và bạn sẽ thấy sự khác biệt.

container PPL không khóa -> nó sẽ nhanh hơn (nó có lẽ chờ miễn phí quá, hoặc sử dụng một cấp phát được cải thiện, trong khi STL không trừ khi bạn chỉ định cấp phát này)

Trong đơn đề enrivronement mặc dù có thể là chi phí của khóa nhỏ hơn một trong các thùng chứa PPL.

(trong cùng một loại ý tưởng hàng đợi đồng thời coost hoặc container đồng thời TBB (intel) sẽ nhanh hơn so với STL container mà có thể tất cả các khóa)

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