Created
March 5, 2019 03:03
-
-
Save kevmal/7ed892d2e366e14bcee348ba7432d792 to your computer and use it in GitHub Desktop.
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
#time | |
let a : byte[] = Array.zeroCreate 1000000 | |
let b : int[] = Array.zeroCreate (1000000/4) | |
open System.Runtime.InteropServices | |
open System | |
let test1() = | |
let mutable s = 0uy | |
for i = 0 to a.Length - 1 do | |
s <- a.[i] | |
let test2 (a : byte []) = | |
let a = a.AsSpan() | |
let mutable s = 0uy | |
for i = 0 to a.Length - 1 do | |
s <- a.[i] | |
let test3() = | |
let mutable s = 0uy | |
for i = 0 to a.Length - 1 do | |
s <- a.AsSpan().[i] | |
let test4() = | |
let mutable s = 0uy | |
for i = 0 to a.Length - 1 do | |
s <- MemoryMarshal.Cast<int,byte>(MemoryMarshal.Cast<byte,int>(a.AsSpan())).[i] | |
let test5 (m : Memory<int>) = | |
let mutable s = 0uy | |
for i = 0 to a.Length - 1 do | |
s <- MemoryMarshal.Cast<int,byte>(m.Span).[i] | |
let test6() = | |
let mutable s = 0uy | |
for i = 0 to a.Length - 1 do | |
s <- Span<byte>(&&b.[0] |> NativeInterop.NativePtr.toVoidPtr,b.Length*sizeof<int>).[i] | |
let mm = | |
{new MemoryManager<byte>() with | |
member x.GetSpan() = MemoryMarshal.Cast<int,byte>(b.AsSpan()) | |
member x.Pin(_) = failwith "pin" | |
member x.Unpin() = failwith "unpin" | |
member x.Dispose(_) = () | |
} | |
let test7() = | |
let mutable s = 0uy | |
for i = 0 to a.Length - 1 do | |
s <- mm.GetSpan().[i] | |
let test8() = | |
let mutable s = 0 | |
for i = 0 to b.Length - 1 do | |
s <- b.AsSpan().[i] | |
let test9() = | |
let mutable s = 0 | |
for i = 0 to b.Length - 1 do | |
s <- System.Buffers.Binary.BinaryPrimitives.ReadInt32LittleEndian(Span.op_Implicit(a.AsSpan().Slice(i))) | |
let test10() = | |
let mutable s = 0uy | |
let ptr = &&b.[0]|> NativeInterop.NativePtr.toVoidPtr | |
for i = 0 to a.Length - 1 do | |
s <- Span<byte>(ptr ,b.Length*sizeof<int>).[i] | |
let test11() = | |
let mutable s = 0uy | |
for i = 0 to a.Length - 1 do | |
use ptr = fixed &b.[0] | |
s <- Span<byte>(ptr |> NativeInterop.NativePtr.toVoidPtr, b.Length*sizeof<int>).[i] | |
let test12 (m : Memory<int>) = | |
let mutable s = 0uy | |
for i = 0 to a.Length - 1 do | |
use p = m.Pin() | |
s <- Span<byte>(p.Pointer, b.Length*sizeof<int>).[i] | |
let test13 (m : Memory<int>) = | |
let mutable s = 0uy | |
for i = 0 to a.Length - 1 do | |
s <- Span<byte>(&&(m.Span.[0]) |> NativeInterop.NativePtr.toVoidPtr, b.Length*sizeof<int>).[i] | |
let test14 (m : Memory<byte>) = | |
let mutable s = 0uy | |
for i = 0 to a.Length - 1 do | |
s <- m.Span.[i] | |
let inline cast<'T>(p : Memory<byte>): byref<'T> = (# "" p : byref<'T> #) | |
let inline retype (t : ^t) : ^tm = (# "" t : ^tm #) | |
//let inline retype (t : byte Span) : int Span = (# "" t : int Span #) | |
let test = new Memory<byte>([|11uy; 11uy; 11uy; 11uy|]) | |
let mem : int = (retype test.Span).[0] | |
printfn "same: %d" mem | |
0 | |
do | |
let test = new Memory<byte>([|11uy; 11uy; 11uy; 11uy|]) | |
use p = test.Pin() | |
let mem : int = retype p.Pointer | |
printfn "mem %d %d" mem (Span(p.Pointer,1).[0]) | |
BitConverter.ToInt32([|11uy; 11uy; 11uy; 11uy|],0) | |
let test11() = | |
let mutable s = 0uy | |
for i = 0 to a.Length - 1 do | |
s <- retype (b.AsSpan().[i]) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment