【发布时间】:2016-04-11 08:42:08
【问题描述】:
我正在为一种小语言做一个解释器来做数组/关系编程,就像在 kdb+ 中一样。
我想知道当像这样在 AGDT 中编码一个值时 F# 会增加多少内存:
type value =
| Dec of int
| Num of int array
| Float of float array
| Array of value
| Arr of value array
let print x =
printfn "%A" x
let a = [|1; 2|]
let b = Num(a)
let c = [| Dec(1); Dec(2) |]
//print (sizeof Arr) Don't have a easy way to do this
我想知道在 F# 中 a,b,c 是否具有同等性能。这个想法是解释器需要主要处理数组。
因为看起来(根据我在 SO 中的搜索).NET 没有直接的方法来检查值的内存大小,所以我在 swift 中做了类似的事情:
indirect enum ExprC {
case IntC(x:Int32)
case IntA(x:Array<Int32>)
case ArrayC(x:Array<ExprC>)
}
let values:[Int32] = [1, 2]
let v1 = ExprC.ArrayC(x: [ExprC.IntC(x:1), ExprC.IntC(x: 2)])
let v2 = ExprC.IntA(x: values)
print(sizeofValue(values))
print(sizeofValue(v1))
print(sizeofValue(v2))
//RESULTS
//8
//8
//8
顺便说一句,这个结果出乎我的意料,我想象编码必须有额外的存储成本,所以我不确定这是否会在 F# 中发生。
【问题讨论】:
-
最简单的方法 - 创建一大堆 - 在一个什么都不做的程序中说价值 1GB 并测量内存使用情况。
标签: memory f# overhead algebraic-data-types