Có một giả thiết ở đây, rằng cách hiệu quả nhất để thực hiện nhiều câu hỏi "Mảng có chứa X không?" kiểm tra là chuyển đổi mảng thành một hàm băm. Hiệu quả phụ thuộc vào nguồn tài nguyên khan hiếm, thường là thời gian nhưng đôi khi là không gian và đôi khi là nỗ lực của lập trình viên. Bạn đang tăng ít nhất gấp đôi bộ nhớ được tiêu thụ bằng cách giữ một danh sách và một băm của danh sách xung quanh đồng thời. Thêm vào đó, bạn đang viết nhiều mã gốc hơn mà bạn sẽ cần kiểm tra, lập tài liệu, v.v.
Là một thay thế, nhìn vào các module Danh sách :: MoreUtils, đặc biệt là chức năng any()
, none()
, true()
và false()
. Tất cả chúng đều lấy một khối làm điều kiện và một danh sách làm đối số, tương tự như map()
và grep()
:
print "At least one value undefined" if any { !defined($_) } @list;
Tôi đã chạy thử nghiệm nhanh, tải một nửa / usr / share / dict / words vào một mảng (25000 từ), sau đó tìm kiếm 11 từ được chọn từ toàn bộ từ điển (mỗi từ thứ 5000) trong mảng, sử dụng cả mảng -to-hash method và any()
hàm từ List :: MoreUtils.
Trên Perl 5.8.8 được xây dựng từ nguồn, phương thức mảng thành băm chạy nhanh hơn gần 1100 lần so với any()
phương pháp này (nhanh hơn 1300 lần trong Perl 5.8.7 được đóng gói của Ubuntu 6.06.)
Tuy nhiên, đó không phải là câu chuyện đầy đủ - quá trình chuyển đổi mảng thành hàm băm mất khoảng 0,04 giây, trong trường hợp này sẽ giết chết hiệu quả thời gian của phương thức mảng thành hàm băm nhanh hơn any()
phương pháp này gấp 1,5 lần . Vẫn tốt, nhưng gần như không xuất sắc.
Cảm giác ruột của tôi là phương pháp mảng thành băm sẽ đánh bại any()
trong hầu hết các trường hợp, nhưng tôi sẽ cảm thấy tốt hơn rất nhiều nếu tôi có một số chỉ số chắc chắn hơn (rất nhiều trường hợp thử nghiệm, phân tích thống kê tốt, có thể là một số lớn- O phân tích thuật toán của từng phương pháp, v.v.) Tùy thuộc vào nhu cầu của bạn, List :: MoreUtils có thể là giải pháp tốt hơn; nó chắc chắn linh hoạt hơn và ít yêu cầu mã hóa hơn. Hãy nhớ rằng, tối ưu hóa quá sớm là một tội lỗi ... :)