Lưu ý rằng các ký hiệu thực tập của người đọc lisp , sao cho các tham chiếu độc lập đến một ký hiệu đã cho cung cấp cho bạn cùng một đối tượng chính xác và do đó bạn có thể so sánh chúng với eq
(chỉ cần so sánh các địa chỉ đối tượng).
Ngược lại, các chuỗi độc lập luôn là các đối tượng lisp khác nhau và do đó bạn phải so sánh nội dung của chúng.
Do đó, bạn sẽ mong đợi sự eq
so sánh để giành chiến thắng cho hiệu suất.
Thật kỳ lạ (tôi chắc chắn rất ngạc nhiên), một số thử nghiệm tầm thường với benchmark-run
việc mang lại string=
chiến thắng khá nhiều. Điều này có vẻ rất kỳ lạ với tôi. YMMV?
Chỉnh sửa: Vì vậy, tôi chỉ nhận thấy câu trả lời này (và nhận xét của nó) một lần nữa, và cảm thấy được truyền cảm hứng để xem liệu tôi có thể tạo lại và giải thích kết quả.
nb Không có gì được biên dịch byte ban đầu.
Nhận thức đầu tiên là các biểu tượng của tôi là quote
d còn các chuỗi thì không, và ngay lập tức tôi thấy rằng phần quote
chịu trách nhiệm cho phần lớn sự khác biệt về tốc độ:
(benchmark-run 10000000
(string= "foo" "foo"))
là, đối với các chuỗi nhỏ, luôn nhanh hơn:
(benchmark-run 10000000
(eq 'foo 'foo))
tuy nhiên, nếu chúng tôi cũng trích dẫn chuỗi:
(benchmark-run 10000000
(string= '"foo" '"foo"))
mà gần như phát triển mọi thứ hoàn toàn.
Tuy nhiên, trung bình, trừ khi chuỗi khá lớn, so sánh chuỗi dường như vẫn thắng bằng một sợi tóc.
Một cách tiếp cận khác là liên kết các đối tượng với các biến:
(let ((foo 'test)
(bar 'test))
(benchmark-run 10000000
(eq foo bar)))
(let ((foo "test")
(bar "test"))
(benchmark-run 10000000
(string= foo bar)))
Một lần nữa, tôi thấy trung bình chuỗi so sánh nhanh hơn bằng mũi.
Sau khi biên dịch byte, tôi chỉ thấy một kết quả nhất quán cho các trường hợp biến bị ràng buộc, trong đó eq
nhanh hơn string=
(mất khoảng 2/3 thời gian).
Đối với các ví dụ khác, tôi nhận được các kết quả vô nghĩa (với tôi) như các chuỗi được trích dẫn nhanh hơn các chuỗi không được trích dẫn, mà tôi chỉ có thể đoán là nhiễu hiệu quả từ các khía cạnh khác của việc thực thi và / hoặc benchmark-run
chính nó. Có đủ sự khác nhau giữa các lần chạy khác nhau của cùng một chức năng để che khuất hoàn toàn mọi khác biệt giữa các lần chạy của các chức năng khác nhau.
Kết luận của tôi là:
(a) eq
so sánh với một biểu tượng có thể (hơi phản trực giác) chậm hơn so với so sánh chuỗi, nếu biểu tượng được trích dẫn.
(b) Trừ khi các chuỗi khá lớn, sự khác biệt thực tế là không đáng kể, và vì vậy tôi sẽ không bận tâm chuyển đổi cái này sang cái khác vì lý do hiệu suất hoàn toàn.
eq
để so sánh với một biểu tượng.