Created
May 23, 2023 18:23
-
-
Save marklam/ddb74120bf2c6a70b4e4d551faae60dd to your computer and use it in GitHub Desktop.
Benchmark on equality of F# types containing large arrays
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace Benchmarks | |
open BenchmarkDotNet.Attributes | |
type SingleCaseDU = | One of int[] | |
type TwoCaseDU = | Empty | Full of int[] | |
type Record = { Values : int[] } | |
type [<Struct>] StructRecord = { Values : int[] } | |
module Custom = | |
let compareSingle (x : SingleCaseDU) (y : SingleCaseDU) = | |
match x, y with | |
| One x, One y -> LanguagePrimitives.PhysicalEquality x y || x = y | |
let compareTwo (x : TwoCaseDU) (y : TwoCaseDU) = | |
match x, y with | |
| Empty, Empty -> true | |
| Full x, Full y -> LanguagePrimitives.PhysicalEquality x y || x = y | |
| _ -> false | |
[<SimpleJob()>] | |
type BenchmarkEquality() = | |
let values = Array.zeroCreate 100_000_000 | |
let copiedValues = Array.copy values | |
let oneCaseDU = One values | |
let equivalentOneCaseDU = One values | |
let twoCaseDU = Full values | |
let equivalentTwoCaseDU = Full values | |
let record = { Record.Values = values } | |
let equivalentRecord = { Record.Values = values } | |
let structRecord = { StructRecord.Values = values } | |
let equivalentStructRecord = { StructRecord.Values = values } | |
[<Benchmark()>] | |
member _.SameArray() = | |
values.Equals values | |
|> ignore | |
[<Benchmark()>] | |
member _.EquivalentArray() = | |
values.Equals copiedValues | |
|> ignore | |
[<Benchmark()>] | |
member _.SameOneCaseDU() = | |
oneCaseDU.Equals oneCaseDU | |
|> ignore | |
[<Benchmark()>] | |
member _.EquivalentOneCaseDU() = | |
oneCaseDU.Equals equivalentOneCaseDU | |
|> ignore | |
[<Benchmark()>] | |
member _.SameTwoCaseDU() = | |
twoCaseDU.Equals twoCaseDU | |
|> ignore | |
[<Benchmark()>] | |
member _.EquivalentTwoCaseDU() = | |
twoCaseDU.Equals equivalentTwoCaseDU | |
|> ignore | |
[<Benchmark()>] | |
member _.SameRecord() = | |
record.Equals record | |
|> ignore | |
[<Benchmark()>] | |
member _.EquivalentRecord() = | |
equivalentRecord.Equals equivalentRecord | |
|> ignore | |
[<Benchmark()>] | |
member _.SameStructRecord() = | |
structRecord.Equals structRecord | |
|> ignore | |
[<Benchmark()>] | |
member _.EquivalentStructRecord() = | |
equivalentStructRecord.Equals equivalentStructRecord | |
|> ignore | |
[<Benchmark()>] | |
member _.opSameOneCaseDU() = | |
oneCaseDU = oneCaseDU | |
|> ignore | |
[<Benchmark()>] | |
member _.opEquivalentOneCaseDU() = | |
oneCaseDU = equivalentOneCaseDU | |
|> ignore | |
[<Benchmark()>] | |
member _.opSameTwoCaseDU() = | |
twoCaseDU = twoCaseDU | |
|> ignore | |
[<Benchmark()>] | |
member _.opEquivalentTwoCaseDU() = | |
twoCaseDU = equivalentTwoCaseDU | |
|> ignore | |
[<Benchmark()>] | |
member _.opSameRecord() = | |
record = record | |
|> ignore | |
[<Benchmark()>] | |
member _.opEquivalentRecord() = | |
equivalentRecord = equivalentRecord | |
|> ignore | |
[<Benchmark()>] | |
member _.opSameStructRecord() = | |
structRecord = structRecord | |
|> ignore | |
[<Benchmark()>] | |
member _.opEquivalentStructRecord() = | |
equivalentStructRecord = equivalentStructRecord | |
|> ignore | |
[<Benchmark()>] | |
member _.customSameOneCaseDU() = | |
Custom.compareSingle oneCaseDU oneCaseDU | |
|> ignore | |
[<Benchmark()>] | |
member _.customEquivalentOneCaseDU() = | |
Custom.compareSingle oneCaseDU equivalentOneCaseDU | |
|> ignore | |
[<Benchmark()>] | |
member _.customSameTwoCaseDU() = | |
Custom.compareTwo twoCaseDU twoCaseDU | |
|> ignore | |
[<Benchmark()>] | |
member _.customEquivalentTwoCaseDU() = | |
Custom.compareTwo twoCaseDU equivalentTwoCaseDU | |
|> ignore |
Author
marklam
commented
May 23, 2023
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment