2012-01-03 40 views
5

Tôi chạy một profiler (rất buồn ngủ) trên chương trình của tôi và nó cho thấy một tỷ lệ cao trên chức năng thiết lập lại của tôi (chức năng thiết lập lại chạy mỗi khung hình). Các chương trình trông như thế này:vector :: clear() tốn quá nhiều thời gian?

Init Mục:

std::vector<std::vector<int>> VecOfVecOfPath; 
VecOfVecOfPath.resize(20); 
for(int i=0; i<20; i++) VecOfVecOfPath.reserve(640); 

VecOfVecOfPath là một loạt các con đường được tìm thấy bởi các chức năng khác. VecOfVecOfPath [i] sẽ được điền trong khi thực hiện, mỗi khung hình. Ví dụ: Đó là push_back -ed bởi các chức năng khác và đặt lại trước khi sử dụng, mỗi khung hình.

Chức năng reset:

void Reset() 
{ 
for(int i=0; i<20; i++) VecOfVecOfPath[i].clear(); 
} 

Vì vậy, các thiết lập lại rất đơn giản, nhưng nó có một thứ hạng khá cao trong hồ sơ.

Điều này có phổ biến không? Liệu vector :: clear() có các chi phí như vậy ngay cả đối với các vector kiểu dựng sẵn không?

Cảm ơn!


Tôi đã thử xây dựng chương trình ở chế độ Phát hành và sau đó chi phí giảm xuống gần như bằng không. Từ 12 ~ 13% đến 0,03 ~ 0,04%.

Sau đó, tôi đã đi đến mã nguồn và có định nghĩa như ITERATOR_DEBUG_LEVEL thực hiện các hoạt động bổ sung trong chế độ Gỡ lỗi.

Vì vậy, nó giống như @ noggin182 được đề xuất, mọi thứ khác nhau ở chế độ Gỡ lỗi và Phát hành.

Trích: "meke chắn rằng bạn đang profiling trong phiên bản xây dựng và tìm kiếm để xem nếu có bất kỳ tiền xử lý có điều kiện xác định bạn thiết lập để tăng hiệu suất - noggin182 03 tháng 1 tại 15:32."

+0

Bạn có cho rằng bạn đang gọi ‘clear' không cần thiết? –

+0

@parapurarajkumar - điều đầu tiên cũng xảy ra với tôi. Tôi nghĩ chúng ta cần biết thêm chi tiết về việc sử dụng 'VecOfVec' - có lẽ các Vec có thể được tái chế để tránh sự rõ ràng. –

+4

vectơ của vectơ về cái gì? –

Trả lời

1

Nó phụ thuộc vào những gì là trong vectơ của bạn, nếu vectơ lồng nhau của bạn chứa các lớp thì bạn sẽ gọi d'tor cho mỗi cá thể trong các vectơ lồng nhau. Tôi khá chắc chắn nó cũng sẽ được deallocating bộ nhớ.

Có vẻ như bạn đang viết một trò chơi? Nếu vậy một vài cuốn sách (PDF) tôi đã đọc trên văn bản trò chơi cho thấy rằng vector là tốt để sử dụng chung nhưng bạn sẽ tốt hơn KHÔNG sử dụng nó cho trò chơi. Chỉ cần sử dụng mảng gốc và tự quản lý bộ nhớ hoặc cuộn lớp chứa của riêng bạn.

640 có phải là giới hạn trên của véc tơ của bạn không? Bạn sẽ tốt hơn có lẽ sử dụng một cái gì đó như thế này?

sometype Values[20][640]; 
int size[20]; 

Sau đó gọi thiết lập lại bạn chỉ có thể là

for(int i=0; i<20; i++) size[0] = 0; 

Bạn sẽ vẫn thậm chí có thể sử dụng bất kỳ chức năng STL như thế này:

std::sort(Values[i], Values[i] + size[i]); 

Đó là sự giúp đỡ về nhiều như tôi có thể cung cấp mà không cần thêm bất kỳ thông tin nào

+0

đó là loại int, vì vậy tôi nghĩ rằng nó sẽ không mất nhiều thời gian trên rõ ràng() - ing nó. Và tôi nghĩ rằng mảng tự nhiên giống như vectơ nếu tôi dự trữ chính xác() cho nó? Sau đó, vectơ sẽ không phân bổ lại vì vậy nó nhanh chóng. –

+0

ok, nếu nó là một vector int thì tôi đã nghĩ rằng điều này không nên chậm. Bạn đang sử dụng trình biên dịch nào? Tôi đã không nhìn vào tất cả các triển khai của vector nhưng tôi đã ngạc nhiên về sự khác biệt giữa MSVC, Borland và GCC. Tất cả chúng đều có các switch để cho phép kiểm tra độ an toàn và debug nhất định và thực hiện các nhiệm vụ như kiểm tra phạm vi và che chắn chắc chắn bạn chỉ sử dụng các trình vòng lặp trên vùng chứa mà chúng có nghĩa là. Tôi chắc chắn bạn đang profiling trong phát hành xây dựng và tìm kiếm để xem nếu có bất kỳ preprocessor điều kiện xác định bạn đặt để tăng hiệu suất. – noggin182

+0

Tôi đang sử dụng VS2010 chuyên nghiệp. Tôi sẽ cố gắng phát hành xây dựng vào cuối sáng nay và báo cáo kết quả, cảm ơn! –

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