2012-05-21 23 views
7
struct test_struct 
{ 
    test_struct() {} 
    ~test_struct() {} 
}; 

#include <vector> 
#include <memory> 
#include <cstdio> 

int main() 
{ 
    printf("ctor begin\n"); 
    { 
     std::vector<std::unique_ptr<test_struct>> test_vec; 
     const int count = 100000; 

     for (auto i = 0; i < count; i++) { 
      test_vec.emplace_back(new test_struct); 
     } 
     printf("dtor begin\n"); 
    } 
    printf("dtor end\n"); 
} 

Tôi đang sử dụng VS2010 và tìm thấy một số vấn đề hiệu suất vô lý. Đoạn mã trên hoạt động tốt cả trong debug và release build (ctrl + f5), nhưng khi debugger được đính kèm (f5), dtor call cho class unique_ptr không thể chạy chậm. Mã máy kết quả là khá tối ưu, vì vậy tôi không nghĩ rằng đó là vấn đề trình biên dịch chứ không phải là trình gỡ lỗi, nhưng tôi không biết cách xử lý nó. Câu hỏi của tôi làGọi tốc độ độc đáo chậm khi có trình gỡ lỗi được đính kèm (msvc)

  • Sự cố này có thể được sao chép trên máy của bạn không?
  • Lý do của hành vi này là gì?
  • Có cách giải quyết nào không?
+0

Thử xả sau mỗi lần in. – Pubby

+0

@Pubby: Điều đó sẽ không tạo ra sự khác biệt, chỉ có 3 'printf's tổng, không phải là một cho mỗi vòng lặp lặp lại. –

+0

Tôi đã có thể tái tạo điều này trên ấn bản express VS2010 của mình. – RedX

Trả lời

6

Sự chậm lại là do kiểm tra bộ nhớ xảy ra bất cứ khi nào bộ nhớ được giải phóng. Tuy nhiên, đây là một đống hệ thống/trình gỡ lỗi đặc biệt, và không phải là bất cứ thứ gì bạn có thể kiểm soát từ bên trong chương trình của bạn.

Có một số great article on the issue. Để tóm tắt: bạn phải thiết lập một biến môi trường để vô hiệu hóa nó!

May mắn thay, bạn có thể đặt biến môi trường dự án cụ thể từ tùy chọn gỡ lỗi trong cài đặt dự án cho dự án của bạn, để biến môi trường chỉ được áp dụng cho chương trình của bạn.

tôi đã sử dụng chương trình đơn giản này để kiểm tra:

#include <iostream> 
#include <memory> 
#include <vector> 

int main() 
{ 
    std::cout << "ctor begin" << std::endl; 
    { 
     std::vector<std::unique_ptr<int>> test_vec; 

     for (unsigned i = 0; i < 100000; i++) 
      test_vec.emplace_back(new int); 

     std::cout << "dtor begin" << std::endl; 
    } 
    std::cout << "dtor end" << std::endl; 
} 

Bằng cách đặt _NO_DEBUG_HEAP=1 như là một biến môi trường (hoặc toàn hệ thống, mà tôi sẽ không khuyên bạn, hoặc thông qua các tùy chọn gỡ lỗi), mã chạy trong khoảng thời gian tương tự không phụ thuộc vào việc trình gỡ lỗi có được đính kèm hay không.

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