2 people like it.
Like the snippet!
StructPerfTest
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
|
//let equalsOpt (x : #System.IEquatable<'T>) (y : #System.IEquatable<'T>) =
let equalsOpt<'T when 'T :> System.IEquatable<'T>> (x : 'T) (y : 'T) =
x.Equals(y)
let compareOpt (x : #System.IComparable<'T>) (y : #System.IComparable<'T>) = x.CompareTo(y)
let compareOpt<'T when 'T :> System.IComparable<'T>> (x : 'T) (y : 'T) = x.CompareTo(y)
[<CustomEquality; CustomComparison>]
[<Struct>]
type MStruct =
val mutable v : int
new (v) = { v = v }
override x.Equals(yobj) =
printfn "Object.Equals"
match yobj with
| :? MStruct as y -> equalsOpt x y
| _ -> false
override x.GetHashCode() = hash x.v
static member op_Equality(x, y) =
printfn "op_Equality"
equalsOpt x y
static member (==) (x, y) = equalsOpt x y
//static member (=) (x, y) = equalsOpt x y
static member op_LessThan(x, y) =
printfn "op_LessThan"
compareOpt x y
//static member (<)(x, y) = compareOpt x y
interface System.IEquatable<MStruct> with
member x.Equals(y) =
printfn "IEquatable<MStruct>.Equals"
x.v = y.v
interface System.IComparable with
member x.CompareTo(yobj) =
printfn "IComparable.CompareTo"
match yobj with
| :? MStruct as y -> compare x.v y.v
| _ -> invalidArg "yobj" "cannot compare values of different types"
interface System.IComparable<MStruct> with
member x.CompareTo(y) =
printfn "IComparable<MStruct>.CompareTo"
compare x.v y.v
let x = new MStruct(2)
let y = new MStruct(2)
//let x = new MStruct(2) :> System.IEquatable<_>
//let y = new MStruct(2) :> System.IEquatable<_>
compareOpt x y
equalsOpt x y
MStruct.op_Equality(x, y) // Calls op_Equality then specialized Equatable<MStruct>
x == y // Calls (==) then specialized Equatable<MStruct>
x = y // Always calls the slower Object.Equals first instead of the custom op_Equality and then specialized IEquatable<MStruct>.Equals
x < y // Always calls the slower IComparable.CompareTo instead of then specialized IComparable<MStruct>.CompareTo
|
val equalsOpt : x:'T -> y:'T -> bool (requires 'T :> System.IEquatable<'T>)
Full name: Script.equalsOpt
namespace System
type IEquatable<'T> =
member Equals : other:'T -> bool
Full name: System.IEquatable<_>
val x : 'T (requires 'T :> System.IEquatable<'T>)
val y : 'T (requires 'T :> System.IEquatable<'T>)
System.IEquatable.Equals(other: 'T) : bool
val compareOpt : x:#System.IComparable<'b> -> y:'b -> int (requires 'b :> System.IComparable<'b>)
Full name: Script.compareOpt
val x : #System.IComparable<'b> (requires 'b :> System.IComparable<'b>)
Multiple items
type IComparable<'T> =
member CompareTo : other:'T -> int
Full name: System.IComparable<_>
--------------------
type IComparable =
member CompareTo : obj:obj -> int
Full name: System.IComparable
val y : 'b (requires 'b :> System.IComparable<'b>)
System.IComparable.CompareTo(other: 'b) : int
val compareOpt : x:'T -> y:'T -> int (requires 'T :> System.IComparable<'T>)
Full name: Script.compareOpt
val x : 'T (requires 'T :> System.IComparable<'T>)
val y : 'T (requires 'T :> System.IComparable<'T>)
System.IComparable.CompareTo(other: 'T) : int
Multiple items
type CustomEqualityAttribute =
inherit Attribute
new : unit -> CustomEqualityAttribute
Full name: Microsoft.FSharp.Core.CustomEqualityAttribute
--------------------
new : unit -> CustomEqualityAttribute
Multiple items
type CustomComparisonAttribute =
inherit Attribute
new : unit -> CustomComparisonAttribute
Full name: Microsoft.FSharp.Core.CustomComparisonAttribute
--------------------
new : unit -> CustomComparisonAttribute
Multiple items
type StructAttribute =
inherit Attribute
new : unit -> StructAttribute
Full name: Microsoft.FSharp.Core.StructAttribute
--------------------
new : unit -> StructAttribute
Multiple items
type MStruct =
struct
interface IComparable<MStruct>
interface IComparable
interface IEquatable<MStruct>
new : v:int -> MStruct
val mutable v: int
override Equals : yobj:obj -> bool
override GetHashCode : unit -> int
static member ( = ) : x:'c * y:'c -> bool (requires 'c :> IEquatable<'c>)
static member ( == ) : x:'b * y:'b -> bool (requires 'b :> IEquatable<'b>)
static member ( < ) : x:'a * y:'a -> int (requires 'a :> IComparable<'a>)
end
Full name: Script.MStruct
--------------------
MStruct()
new : v:int -> MStruct
MStruct.v: int
Multiple items
val int : value:'T -> int (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.int
--------------------
type int = int32
Full name: Microsoft.FSharp.Core.int
--------------------
type int<'Measure> = int
Full name: Microsoft.FSharp.Core.int<_>
val v : int
val x : byref<MStruct>
override MStruct.Equals : yobj:obj -> bool
Full name: Script.MStruct.Equals
val yobj : obj
val printfn : format:Printf.TextWriterFormat<'T> -> 'T
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn
val y : MStruct
override MStruct.GetHashCode : unit -> int
Full name: Script.MStruct.GetHashCode
val hash : obj:'T -> int (requires equality)
Full name: Microsoft.FSharp.Core.Operators.hash
val x : 'c (requires 'c :> System.IEquatable<'c>)
val y : 'c (requires 'c :> System.IEquatable<'c>)
val x : 'b (requires 'b :> System.IEquatable<'b>)
val y : 'b (requires 'b :> System.IEquatable<'b>)
val x : 'a (requires 'a :> System.IComparable<'a>)
val y : 'a (requires 'a :> System.IComparable<'a>)
override MStruct.Equals : y:MStruct -> bool
Full name: Script.MStruct.Equals
override MStruct.CompareTo : yobj:obj -> int
Full name: Script.MStruct.CompareTo
val compare : e1:'T -> e2:'T -> int (requires comparison)
Full name: Microsoft.FSharp.Core.Operators.compare
val invalidArg : argumentName:string -> message:string -> 'T
Full name: Microsoft.FSharp.Core.Operators.invalidArg
override MStruct.CompareTo : y:MStruct -> int
Full name: Script.MStruct.CompareTo
val x : MStruct
Full name: Script.x
val y : MStruct
Full name: Script.y
static member MStruct.( = ) : x:'c * y:'c -> bool (requires 'c :> System.IEquatable<'c>)
More information