Skip to content

Instantly share code, notes, and snippets.

@atifaziz
Created October 3, 2010 11:04
Show Gist options
  • Save atifaziz/608502 to your computer and use it in GitHub Desktop.
Save atifaziz/608502 to your computer and use it in GitHub Desktop.
open System
open System.Text
open System.Diagnostics
let main () =
let sample = @"
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Ut eget ligula justo, et malesuada diam. Phasellus lobortis
risus a lorem lacinia pulvinar varius nulla molestie. Nullam
et sapien nec leo elementum convallis. Pellentesque habitant
morbi tristique senectus et netus et malesuada fames ac turpis
egestas.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Ut eget ligula justo, et malesuada diam. Phasellus lobortis
risus a lorem lacinia pulvinar varius nulla molestie. Nullam
et sapien nec leo elementum convallis. Pellentesque habitant
morbi tristique senectus et netus et malesuada fames ac turpis
egestas.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Ut eget ligula justo, et malesuada diam. Phasellus lobortis
risus a lorem lacinia pulvinar varius nulla molestie. Nullam
et sapien nec leo elementum convallis. Pellentesque habitant
morbi tristique senectus et netus et malesuada fames ac turpis
egestas.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Ut eget ligula justo, et malesuada diam. Phasellus lobortis
risus a lorem lacinia pulvinar varius nulla molestie. Nullam
et sapien nec leo elementum convallis. Pellentesque habitant
morbi tristique senectus et netus et malesuada fames ac turpis
egestas.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Ut eget ligula justo, et malesuada diam. Phasellus lobortis
risus a lorem lacinia pulvinar varius nulla molestie. Nullam
et sapien nec leo elementum convallis. Pellentesque habitant
morbi tristique senectus et netus et malesuada fames ac turpis
egestas.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Ut eget ligula justo, et malesuada diam. Phasellus lobortis
risus a lorem lacinia pulvinar varius nulla molestie. Nullam
et sapien nec leo elementum convallis. Pellentesque habitant
morbi tristique senectus et netus et malesuada fames ac turpis
egestas."
let time iterations work =
work () // warm up, JIT, etc.
let sw = new Stopwatch()
sw.Start()
for i in 1..iterations do
work ()
sw.Elapsed
let put (sb : StringBuilder) (buffer : char[]) index ch =
let len = buffer.Length
let index = if index = len then
sb.Append(buffer, 0, len) |> ignore; 0
else
index
buffer.[index] <- ch
index + 1
let time = time 1000
let bufferingStringBuilder (size : int) =
let sb = new StringBuilder()
let buffer = System.Array.CreateInstance(typedefof<char>, size) :?> char[]
let index = ref 0
((fun ch -> index := put sb buffer !index ch),
(fun () -> sb.Append(buffer, 0, !index).ToString()))
let buildString (str : string) (sb : StringBuilder) (size : int) =
let buffer = System.Array.CreateInstance(typedefof<char>, size) :?> char[]
let rec buildString2 si di =
if si < str.Length then
let ch = str.[si]
let di = if di = buffer.Length then
sb.Append(buffer, 0, di) |> ignore; 0
else
di
buffer.[di] <- ch
buildString2 (si + 1) (di + 1)
else
sb.Append(buffer, 0, di)
buildString2 0 0
let unbufferedTest () =
let sb = new StringBuilder()
for i in 1..(sample.Length - 1) do
sb.Append(sample.[i]) |> ignore
sb.ToString() |> ignore
let bufferedTest () =
let put, flush = bufferingStringBuilder 8192
for i in 1..(sample.Length - 1) do
put(sample.[i])
flush() |> ignore
let recursiveBufferedTest () =
let sb = buildString sample (new StringBuilder()) 8192
sb.ToString() |> ignore
let percent (x : TimeSpan) (y : TimeSpan) =
((x.TotalMilliseconds / y.TotalMilliseconds).ToString("P1"))
for i in 1..10 do
let unbufferedTiming = time unbufferedTest
let bufferedTiming = time bufferedTest
let recursiveBufferedTiming = time recursiveBufferedTest
printfn "Unbuffered:Buffered = %8s | Unbuffered:Recursive %8s | Buffered:Recursive %8s"
(percent unbufferedTiming bufferedTiming)
(percent unbufferedTiming recursiveBufferedTiming)
(percent bufferedTiming recursiveBufferedTiming)
main ()
Unbuffered:Buffered = 141.2 % | Unbuffered:Recursive 362.4 % | Buffered:Recursive 256.5 %
Unbuffered:Buffered = 138.4 % | Unbuffered:Recursive 333.6 % | Buffered:Recursive 241.1 %
Unbuffered:Buffered = 134.6 % | Unbuffered:Recursive 314.0 % | Buffered:Recursive 233.3 %
Unbuffered:Buffered = 138.0 % | Unbuffered:Recursive 404.2 % | Buffered:Recursive 293.0 %
Unbuffered:Buffered = 137.3 % | Unbuffered:Recursive 307.7 % | Buffered:Recursive 224.1 %
Unbuffered:Buffered = 138.5 % | Unbuffered:Recursive 337.7 % | Buffered:Recursive 243.9 %
Unbuffered:Buffered = 138.2 % | Unbuffered:Recursive 373.1 % | Buffered:Recursive 269.9 %
Unbuffered:Buffered = 138.8 % | Unbuffered:Recursive 338.8 % | Buffered:Recursive 244.1 %
Unbuffered:Buffered = 138.5 % | Unbuffered:Recursive 339.5 % | Buffered:Recursive 245.1 %
Unbuffered:Buffered = 137.5 % | Unbuffered:Recursive 333.1 % | Buffered:Recursive 242.3 %
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment