Để cung cấp một số thông tin cơ bản, tôi đang xử lý tệp đã lưu và sau khi sử dụng biểu thức chính quy để chia tệp thành đối tượng thành phần, tôi cần xử lý dữ liệu của đối tượng dựa trên loại đối tượng đó.Có sử dụng std :: async nhiều lần cho các tác vụ nhỏ hiệu năng thân thiện không?
Suy nghĩ hiện tại của tôi là sử dụng tính song song để có được một chút hiệu suất đạt được khi tải từng đối tượng độc lập với nhau. Vì vậy, tôi sẽ định nghĩa một hàm LoadObject
chấp nhận một std::string
đối với từng loại đối tượng tôi sẽ được xử lý và sau đó gọi std::async
như sau:
void LoadFromFile(const std::string& szFileName)
{
static const std::regex regexObject("=== ([^=]+) ===\\n((?:.|\\n)*)\\n=== END \\1 ===", std::regex_constants::ECMAScript | std::regex_constants::optimize);
std::ifstream inFile(szFileName);
inFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
std::string szFileData((std::istreambuf_iterator<char>(inFile)), (std::istreambuf_iterator<char>()));
inFile.close();
std::vector<std::future<void>> vecFutures;
for(std::sregex_iterator itObject(szFileData.cbegin(), szFileData.cend(), regexObject), end; itObject != end; ++itObject)
{
// Determine what type of object we're loading:
if((*itObject)[1] == "Type1")
{
vecFutures.emplace_back(std::async(LoadType1, (*itObject)[2].str()));
}
else if((*itObject)[1] == "Type2")
{
vecFutures.emplace_back(std::async(LoadType2, (*itObject)[2].str()));
}
else
{
throw std::runtime_error("Unexpected type encountered whilst reading data file.");
}
}
// Make sure all our tasks completed:
for(auto& future : vecFutures)
{
future.get();
}
}
Lưu ý rằng sẽ có nhiều hơn 2 loại trong ứng dụng (đây chỉ là một ví dụ ngắn) và có khả năng hàng ngàn đối tượng trong tệp được đọc.
Tôi biết rằng việc tạo quá nhiều chuỗi thường là điều xấu cho hiệu suất khi vượt quá phần cứng đồng thời tối đa do chuyển ngữ cảnh, nhưng nếu bộ nhớ của tôi phục vụ chính xác thời gian chạy C++ và lên lịch std::async
một cách thích hợp (tôi tin rằng trong trường hợp của Microsoft thư viện ConcRT của họ chịu trách nhiệm về điều này?), vì vậy mã trên có thể vẫn dẫn đến cải thiện hiệu suất?
Cảm ơn trước!
Đoạn mã trên * có thể * trong kết quả thực tế trong việc cải thiện hiệu suất, nhưng tôi muốn nói rằng nó phụ thuộc về số lượng công việc mà mỗi 'LoadTypeX' đang làm. Là nó đủ để outweigh trên đầu bạn phải chịu trong thread chính của bạn cho tung ra và chờ đợi và đồng bộ hóa? Chưa kể số lượng bộ nhớ cache bị xóa và số lần chia sẻ giả tăng lên. Và các hình phạt khác liên quan đến lập trình đa luồng. Vì vậy, nếu các đối tượng của bạn là lớn và chức năng tải không đồng bộ của bạn đang làm công việc đáng kể, tôi muốn nói nó có thể có giá trị nó. Nhưng tại sao bạn không đo lường? – yzt
Không liên quan: bạn đang tạo ra một véc tơ của 100 tương lai được xây dựng mặc định và sau đó thêm tương lai thực của bạn vào cuối. Gọi 'get()' trên các kết quả tương lai mặc định được xây dựng trong hành vi không xác định. – Casey
Bạn đã lược tả mã của mình chưa? Tôi đã có thể dự kiến chi phí I/O để lùn chi phí xử lý đến mức mà lợi ích từ việc tách quá trình xử lý thành các chủ đề có thể không đo lường được. –