gpt4 book ai didi

f# - 使用 F# 的选项类型基准测试

转载 作者:行者123 更新时间:2023-12-01 09:29:57 24 4
gpt4 key购买 nike

我需要在繁重的数值模拟中使用 Some/None 选项。下面的微基准测试给了我 Fast = 485Slow = 5890

我不喜欢空值,即使我喜欢它们我也不能使用空值,因为类型'float'没有'null'作为正确的值

理想情况下,应该有一个编译器选项可以将 Some/None 编译为 value/null,这样就不会有运行时损失。那可能吗?或者我应该如何让 Some/None 高效?

let s = System.Diagnostics.Stopwatch()

s.Start()
for h in 0 .. 1000 do
Array.init 100000 (fun i -> (float i + 1.)) |> ignore
printfn "Fast = %d" s.ElapsedMilliseconds

s.Restart()
for h in 0 .. 1000 do
Array.init 100000 (fun i -> Some (float i + 1.)) |> ignore
printfn "Slow = %d" s.ElapsedMilliseconds

最佳答案

None实际上已经表示为 null .但是自从option<_>是引用类型(null 是 .NET 类型系统中的有效值所必需的),创建 Some实例必然需要堆分配。一种替代方法是使用 .NET System.Nullable<_>类型,类似于 option<_> ,除了:

  1. 它是一个值类型,所以不需要堆分配
  2. 它只支持值类型作为元素,所以你可以创建一个option<string> ,但不是 Nullable<string> .对于您的用例,这似乎是一个不重要的因素。
  3. 它具有运行时支持,因此在没有值的情况下将可空值装箱会导致空引用,否则这是不可能的

请记住,您的基准测试只做很少的工作,因此结果可能与您在实际工作负载下看到的结果不同。如果可能,请尝试根据您的实际情况使用更有意义的基准。

附带说明,如果您使用 #time,您可以获得更有意义的诊断信息(包括垃圾收集统计信息)。 F# 中的指令,而不是使用 Stopwatch .

关于f# - 使用 F# 的选项类型基准测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16652973/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com