Tôi đã luôn luôn được nói với vectơ là nhanh chóng, và trong những năm kinh nghiệm lập trình của tôi, tôi chưa bao giờ thấy bất cứ điều gì để ký hợp đồng đó. Tôi quyết định (tối ưu hóa sớm và) viết một lớp kết hợp mà là một wrapper mỏng xung quanh một container tuần tự (cụ thể là ::std::vector
và cung cấp giao diện tương tự như ::std::map
. Hầu hết các mã đã thực sự dễ dàng, và tôi đã nhận nó làm việc với ít khó khăn. Tuy nhiên, trong các thử nghiệm của tôi về các loại POD có kích thước khác nhau (4 đến 64 byte) và std::strings
, với số lượng thay đổi từ tám đến hai nghìn, ::std::map::find
nhanh hơn ::associative::find
của tôi, thường nhanh hơn khoảng 15%, cho hầu hết tất cả các thử nghiệm Tôi đã thực hiện một số Short, Self Contained, Correct (Compilable), Example cho thấy rõ ràng điều này at ideone Tôi đã kiểm tra việc thực hiện MSVC9 của ::std::map::find
và xác nhận rằng nó khớp với mã số vecfind
và ::std::lower_bound
của mình khá chặt chẽ, và không thể giải thích tại sao số ::std::map::find
chạy nhanh hơn, ngoại trừ một cuộc thảo luận về Stack Overflow, nơi mọi người suy đoán rằng phương thức tìm kiếm nhị phân không có lợi gì cả từ địa phương của vector cho đến lần so sánh cuối cùng (làm cho nó không nhanh hơn), và nó yêu cầu số học con trỏ mà các nút ::std::map
không yêu cầu, làm cho nó chậm hơn.Tại sao vector nhanh hơn bản đồ trong một thử nghiệm, nhưng không phải là bản đồ kia?
Hôm nay có người thách thức tôi về vấn đề này và cung cấp this code at ideone, khi tôi kiểm tra, cho thấy véc tơ nhanh gấp hai lần.
Các lập trình viên của StackOverflow có muốn khai sáng cho tôi về sự khác biệt rõ ràng này không? Tôi đã đi qua cả hai bộ mã, và họ có vẻ euqivalent với tôi, nhưng có lẽ tôi mù từ chơi với cả hai người trong số họ rất nhiều.
(Footnote: đây là rất gần-one of my previous questions, nhưng mã của tôi đã có một vài lỗi mà đã được giải quyết Do thông tin mới/code, tôi cảm thấy đây là khác nhau, đủ để biện minh cho một câu hỏi riêng biệt Nếu không, tôi.. . ll việc sáp nhập chúng)
Bạn đã cố gắng sắp xếp hai triển khai chưa? Thành thật mà nói, chỉ cần nhìn vào mã rất thường không thực sự hữu ích. Naving dữ liệu cụ thể sẽ chỉ cho bạn theo hướng chung. – linuxuser27
Do tất cả mọi thứ được inlined, profiler của tôi đã cho tôi ít thông tin hơn tôi đã có từ đầu ra. –
Nội suy quá mức có thể làm chậm mọi thứ khi bạn liên tục đẩy nội dung ra khỏi bộ đệm CPU. Kể từ khi bạn đang trên Windows biên dịch cho kích thước mã mà không cần bất kỳ nội tuyến và đo lường. – JimR