.net - Difference between Array.zeroCreate and Array.init -


i wanted show colleague can allocate more 2gb of ram, made little test application.

let mega = 1 <<< 20 let konst x y = x let allocate1mb _ = array.init mega (konst 0uy) let memoryhog = array.parallel.init 8192 allocate1mb  printfn "i'm done..." system.console.readkey() |> ignore 

this works , see process happily hogging away @ system's memory. however, takes long - hence array.parallel.init.

i noticed, same code not work, if write with

let allocate1mb _ = array.zerocreate mega 

more precisely, no data allocated , takes no time.

so question; what difference in semantics between array.zerocreate , array.init?

i understand array.init run konst 0uy function each time, explain time difference. why array.zerocreate not allocate memory?

from fsharp.core sources:

let inline init (count:int) (f: int -> 't) =      if count < 0 invalidarg "count" inputmustbenonnegativestring     let arr = (zerocreateunchecked count : 't array)       = 0 count - 1          arr.[i] <- f     arr  let zerocreate count =      if count < 0 invalidarg "count" (sr.getstring(sr.inputmustbenonnegative))     microsoft.fsharp.primitives.basics.array.zerocreateunchecked count  let inline zerocreateunchecked (count:int) =      (# "newarr !0" type ('t) count : 't array #) 

as can see, both functions use zerocreateunchecked under hood, compiled newarr il supposed push new array onto stack.

the fact not consume memory in case might indicate kind of optimization responsible. think either jit or compiler removing operation since created array never used, , not happen in case of array.init.


Comments

Popular posts from this blog

java.util.scanner - How to read and add only numbers to array from a text file -

rewrite - Trouble with Wordpress multiple custom querystrings -