câu trả lời khác là rất tốt, nhưng bạn có thể dễ dàng trả lời nó cho mình bằng cách this method.
THÊM: Để trả lời nhận xét, hãy để tôi cho bạn biết ý tôi là gì. Tôi đang chạy VC trên Windows, nhưng điều này hoạt động trên bất kỳ ngôn ngữ/hệ điều hành. Tôi đã lấy chương trình đầu tiên của bạn và tăng kích thước lên 20000 vì vậy nó sẽ chạy đủ lâu. Sau đó, trong khi nó đang chạy, tôi đã lấy một số stackshots. Tất cả họ đều giống như thế này:
std::vector<bool,std::allocator<bool> >::begin() line 93 + 25 bytes
std::vector<bool,std::allocator<bool> >::operator[]() line 132 + 37 bytes
main() line 24 + 12 bytes
mainCRTStartup() line 206 + 25 bytes
KERNEL32! 7c817077()
Vì vậy, những gì mà nói là nó được dành chủ yếu tất cả của nó là thời gian trong hoạt động lập chỉ mục trên dòng 24, và lý do nó dành thời gian đó là các nhà điều hành []
là gọi nhà điều hành begin
. Cụ thể hơn:
main() line 24 + 12 bytes
là mã này:
for(int j = 0; j < size; j++){
==> v[i] = true;
}
mà các cuộc gọi:
std::vector<bool,std::allocator<bool> >::operator[]() line 132 + 37 bytes
đó là mã này (mà tôi định dạng lại một chút):
reference operator[](size_type _P){
==> return (*(begin() + _P));
}
gọi:
std::vector<bool,std::allocator<bool> >::begin() line 93 + 25 bytes
được làm điều này (chi tiết hơn):
92: iterator begin()
93: {return (_First); }
00402890 push ebp
00402891 mov ebp,esp
00402893 sub esp,44h
00402896 push ebx
00402897 push esi
00402898 push edi
00402899 push ecx
0040289A lea edi,[ebp-44h]
0040289D mov ecx,11h
004028A2 mov eax,0CCCCCCCCh
004028A7 rep stos dword ptr [edi]
004028A9 pop ecx <===============
004028AA mov dword ptr [ebp-4],ecx
004028AD mov eax,dword ptr [ebp-4]
004028B0 mov eax,dword ptr [eax+4]
004028B3 pop edi
004028B4 pop esi
004028B5 pop ebx
004028B6 mov esp,ebp
004028B8 pop ebp
004028B9 ret
gì nó đang làm là viết 68 byte của 0xCC
trên stack (vì một lý do debug) như một phần của nhận địa chỉ begin
của vectơ, như một phần của việc tính toán địa chỉ của v[i]
, trước khi thực hiện nhiệm vụ.
Phần thời gian mà nó dành cho việc này là gần 100%, bởi vì nó đang thực hiện nó trên mỗi một số mẫu được lấy. Bạn có thể đoán rằng đó là những gì nó đã được chi tiêu gần như tất cả thời gian của nó làm? Tôi không thể.
Đây là, tất nhiên, một bản dựng Gỡ lỗi. Nếu bạn chuyển sang bản phát hành Bản phát hành, nhưng bật thông tin gỡ lỗi, tất cả các chức năng này sẽ được inline và tối ưu hóa, vì vậy nó sẽ nhanh hơn gấp 30 lần, và một lần nữa stackshots nói chính xác những gì nó đang làm.
Vì vậy, - mọi người có thể cho bạn biết những gì nó có thể được làm, nhưng điều này cho thấy làm thế nào để tìm hiểu cho chính mình những gì nó là thực sự làm.
Trên môi trường của bạn, chắc chắn nó sẽ khác.
std :: vector không phải là vùng chứa. Đọc: http://www.gotw.ca/publications/mill09.htm –
Lưu ý quan trọng: Mặc dù bạn đến đúng kết luận, nhưng bạn không thực hiện so sánh đúng. Bạn thực hiện N^2 vòng lặp của vòng lặp trong cùng (câu lệnh 'v [i] = true'), nhưng N là 2000 trong một bài kiểm tra và 10000 trong một bài kiểm tra khác, vì vậy bạn thực sự làm 25 lần nhiều công việc, chứ không phải 5 gấp nhiều lần, ngoài sự khác biệt giữa 'vectơ' và một mảng đơn giản. Điều này thực sự làm cho sự khác biệt thậm chí còn rõ rệt hơn. –
@ user235022 Bạn có nghĩa là 'v [j] = true;' thay vì 'v [i] = true'? Nếu không, nó sẽ rất đơn giản cho trình biên dịch để tối ưu hóa vòng lặp nội bộ, vì các hành động của bạn không phụ thuộc vào biến vòng lặp. – fiktor