Created
October 3, 2010 11:04
-
-
Save atifaziz/608502 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
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 () |
This file contains hidden or 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
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