Tôi đang tự hỏi, trong đó kiểm tra các trường hợp bình đẳng trong F # nguyên nhân đấm bốc, và cho dù có những trường hợp trong đó trọng Equals
và GetHashCode
và thực hiện IEquatable<>
là thích hợp hơn để sử dụng StructuralEqualityAttribute
. Nếu vậy, nó có thể được thực hiện mà không làm giảm hiệu suất của nhà điều hành =
?IEquatable trong F #, = hiệu suất điều hành và bình đẳng về cơ cấu
Đối với các cấu trúc đơn giản giữ một số nguyên, tôi chạy một vòng lặp lặp lại kiểm tra bình đẳng tương tự 1M lần. Tôi hẹn giờ vòng lặp sử dụng ...
=
với tùy chỉnh (loại và kiểm tra giá trị) bình đẳng: khoảng 110ms=
với sự bình đẳng về cơ cấu: 20ms đến 25ms- Một tùy chỉnh
==
điều hành mà chuyển hướng đến IEquatable: 1ms để 3ms - Một tùy chỉnh
==
điều hành so sánh các giá trị trực tiếp: 0ms (xóa bởi ưu)
Từ những gì tôi under tand, giao diện IEquatable<>
có thể được sử dụng như một tối ưu hóa hiệu suất để ngăn chặn quyền anh khi kiểm tra sự bình đẳng. Điều này có vẻ là phổ biến trong C#, nhưng tôi khó có thể tìm thấy đề cập đến nó trong F #. Ngoài ra, trình biên dịch F # phàn nàn khi cố gắng ghi đè toán tử =
cho một loại đã cho.
Thuộc tính StructuralEquality
là documented in the MSDN chỉ ghi đè Equals
và GetHashCode
. Tuy nhiên, nó ngăn chặn việc triển khai rõ ràng IEquatable<>
. Tuy nhiên, loại kết quả không tương thích với IEquatable<MyType>
. Điều này có vẻ không hợp lý với tôi, nên một loại cấu trúc tương đương không thực hiện IEquatable<>
?
Có một lưu ý về việc thực hiện của =
trong F # đặc điểm kỹ thuật (8.15.6.2 trong spec 3.0), nhưng tôi không biết phải làm gì với nó:
Lưu ý: Trong thực tế, nhanh (nhưng ngữ nghĩa tương đương) mã được phát ra cho các cuộc gọi trực tiếp đến (=), so sánh, và băm cho tất cả các loại cơ sở, và các đường dẫn nhanh hơn được sử dụng để so sánh nhất mảng
định nghĩa về "các loại cơ sở" được đưa ra trước đây không có vẻ hữu ích để đọc ghi chú này. Điều này có đề cập đến các loại cơ bản không?
Tôi đang bối rối. Chuyện gì vậy? Việc thực hiện bình đẳng thích hợp sẽ như thế nào, nếu loại có thể được sử dụng như một khóa tập hợp hoặc trong một thử nghiệm bình đẳng thường xuyên?