我在F#中定义一个秒表:
open System.Diagnostics
let UptimeStopwatch = Stopwatch.StartNew()
我用
每3秒打印一次printfn "%A" UptimeStopwatch.Elapsed
每次我收到“00:00:00.0003195”或类似的小东西。每次我引用UptimeStopwatch时F#都会调用构造函数吗?如果是这样,我如何绕过这个广告达到预期的效果?这是功能性和命令式编程的混乱混合。
答案 0 :(得分:6)
F#似乎解释了像
这样的陈述let MyFunction = DoSomething()
和
let MyFunction() = DoSomething()
不同。第一个将DoSomething()
的返回值绑定到变量MyFunction
,第二个将操作DoSomething()
绑定到函数MyFunction()
。
我对UptimeStopwatch
的使用是正确的,错误在我的实施中的其他地方。
答案 1 :(得分:2)
我发现你已经在代码的其他地方发现了一个问题,但你问题中的两行仍然需要一些时间来运行,有趣的是,你可以减少开销。
当我在样本中运行两行时,它会打印一个大约0.0002142的值。您可以通过使用let
存储已用时间来缩小它,因为构造printf
格式字符串(第一个参数)的表示会产生一些开销:
let UptimeStopwatch = Stopwatch.StartNew()
let elapsed = UptimeStopwatch.Elapsed
printfn "%A" elapsed
这打印的平均数约为0.0000878(小两倍)。如果您使用Console
,结果是相似的(因为Elapsed
属性是在调用Console
之前获得的,并且在此期间不需要执行任何其他操作):
let UptimeStopwatch = Stopwatch.StartNew()
System.Console.WriteLine(UptimeStopwatch.Elapsed)