Skip to content

Instantly share code, notes, and snippets.

@kevmal
Created March 5, 2019 03:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kevmal/7ed892d2e366e14bcee348ba7432d792 to your computer and use it in GitHub Desktop.
Save kevmal/7ed892d2e366e14bcee348ba7432d792 to your computer and use it in GitHub Desktop.
#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