2 people like it.

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>)
Raw view Test code New version

More information

Link:http://fssnip.net/7a
Posted:14 years ago
Author:
Tags: