0

我在 F# 中定义秒表:

open System.Diagnostics

let UptimeStopwatch = Stopwatch.StartNew()

我每 3 秒打印一次

printfn "%A" UptimeStopwatch.Elapsed

每次我得到“00:00:00.0003195”或类似的小东西。每次我引用 UptimeStopwatch 时,F# 都会调用构造函数吗?如果是这样,我如何绕过这个广告来达到预期的效果?这是函数式编程和命令式编程的混乱混合。

4

2 回答 2

6

F# 似乎可以解释如下语句

let MyFunction = DoSomething()

let MyFunction() = DoSomething()

不同。第一个将 的返回值绑定DoSomething()到变量MyFunction,第二个将操作绑定DoSomething()到函数MyFunction()

我的使用UptimeStopwatch是正确的,错误在我的实现中的其他地方。

于 2013-01-06T06:35:55.247 回答
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)
于 2013-01-06T11:08:56.427 回答