2015-08-10 23 views
5

Nếu ai đó có thể giúp tôi, tôi hoàn toàn không có ý tưởng.Vấn đề về hiệu suất bản đồ

Vì vậy, tôi có mã này (đó là một phiên bản rất đơn giản của mã của tôi):

while(readNewFile()) 
{ 
    while(getNewStructFromFile()) 
    { 
     unsigned long starttime = GetTickCount(); 
     customerData.fillFromBinaryData(structPointer); 
     cout<< GetTickCount() - starttime; 

     aMap.insert(pair<int,string>(customerData.phoneNumber,"")); 
    } 

    // Ouptut all data 

    aMap.clear(); 
} 

Về cơ bản, nó chỉ đọc hồ sơ từ một tập tin nhị phân. customerData lấy dữ liệu và điền các biến của nó với dữ liệu từ nó. Sau đó, nó chèn số điện thoại vào một bản đồ (để gỡ lỗi Tôi thực sự chỉ cần chèn một int và một chuỗi rỗng).

Vấn đề là sau một thời gian ngắn chương trình này sẽ rất chậm; nếu tôi bình luận ra bản đồ, chương trình sẽ chạy OK mà không gặp vấn đề gì với thời gian thực thi liên tục cho mỗi tập tin. Nếu tôi sử dụng chèn bản đồ, sau một vài tập tin, chương trình lại chạy rất chậm (từ 8 - 10 giây đến 1 phút hoặc hơn). Nhưng gỡ lỗi với GetTickCount(), nó cho tôi thấy rằng sự chậm trễ xảy ra trong customerData.fillFromBinaryData (ở 0ms đầu tiên và sau đó nhảy tới 30-40 ms (để điền vào các biến lớp)). Nhưng nếu tôi nhận xét việc chèn bản đồ đơn giản này, không có sự chậm trễ trong việc điền vào đối tượng với dữ liệu! Lý luận đó ở đâu? Ai đó có thể cho tôi một gợi ý, tôi không có ý tưởng. Xin lỗi nếu câu hỏi này không phải là một câu hỏi hay.

Tôi đã thử các loại bản đồ khác nhau, nhưng một lần nữa, nó cho tôi thấy rằng độ trễ không nằm trong bản đồ chèn.

Edit/Có thể giải pháp:

Trong trường hợp ai đó có vấn đề tương tự, tôi cài đặt VS2015, và sự chậm trễ sử dụng bản đồ đã biến mất! Tôi không chắc làm thế nào điều này có liên quan, nhưng Hurray!

+2

Bạn đang in tất cả dữ liệu trong mỗi vòng lặp? Các dữ liệu được lớn hơn mỗi lần .... – Aleksandar

+1

Tôi chỉ đơn giản là không thể là người duy nhất từ ​​xa tò mò tại sao câu hỏi này được gắn thẻ 'asn.1', xem xét hoàn toàn không có đề cập đến nó bất cứ điều gì trong cơ thể câu hỏi. – WhozCraig

+0

Tôi xuất một lần cho mỗi tệp và tôi xóa bản đồ sau này, tại sao nó lại lớn hơn? customerData chỉ là một bản ghi khách hàng, mỗi lần nó nhận được một giá trị mới. Tôi thực sự đang readding từ một tập tin asn :) Tôi không chắc chắn lý do tại sao tôi thêm thẻ ... – Silencer

Trả lời

1

Có thể xảy ra, nếu bản đồ phát triển rất lớn, bạn gặp sự cố với quản lý bộ nhớ và fillFromBinaryData yêu cầu phân bổ bộ nhớ hiện chậm hơn. Do một phân mảnh bộ nhớ có thể?

Tôi khuyên bạn nên thử một số thư viện cho mục đích cụ thể này. Tuy nhiên, tôi quên cách họ được gọi. Tôi chỉ biết rằng có một từ Google, "jemalloc" hoặc một cái gì đó tương tự.

Điểm chính của nhóm bộ nhớ tùy chỉnh là bạn có thể cấp phát bộ nhớ một lần dưới dạng nhóm lớn và chỉ sử dụng nó trong phạm vi ứng dụng của bạn với trình phân bổ tùy chỉnh.

Một điều nữa có thể là ngừng sử dụng bản đồ và sử dụng bản đồ không có thứ tự thay thế. Thay đổi độ phức tạp thời gian để chèn từ O (logn) sang O (1) với hàm băm hoàn hảo, vì đối với bạn, là số điện thoại.

  • Nó được gọi là jemalloc và không phải từ Google. :)
+0

Vâng Tôi gọi clear() sau mỗi tập tin, vì vậy bản đồ sẽ bắt đầu lại từ 0, nó không giống như nó vẫn đang phát triển? Và tôi sử dụng bản đồ không có thứ tự và dự trữ 4000 phần tử, một tập tin có khoảng 3500 hồ sơ – Silencer

+2

Sau đó, nó có thể là một vấn đề phân mảnh.Kiểm tra những gì jemalloc không.Nếu không tôi không biết những gì nó có thể được.Tôi sẽ đề nghị sau đó để chạy ứng dụng của bạn với valgrind --tool = callgrind hoặc một cái gì đó tương tự. – AlexTheo

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