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()

別の方法で。1つ目はの戻り値をDoSomething()変数MyFunctionにバインドし、2つ目はアクションDoSomething()を関数にバインドしますMyFunction()

私の使用法UptimeStopwatchは正しく、エラーは私の実装の他の場所にありました。

于 2013-01-06T06:35:55.247 に答える
2

コードの他の場所ですでに問題が見つかっているようですが、質問の2行は実行に時間がかかり、興味深いことに、オーバーヘッドを小さくすることができます。

サンプルで2行を実行すると、0.0002142付近の値が出力されます。フォーマット文字列(最初の引数)letの表現の構築に関連するオーバーヘッドがあるため、を使用して経過時間を保存することで、これを小さくすることができます。printf

let UptimeStopwatch = Stopwatch.StartNew()
let elapsed = UptimeStopwatch.Elapsed
printfn "%A" elapsed

これは、平均して約0.0000878(2分の1)の数値を出力します。を使用する場合Console、結果は同様です(ElapsedプロパティConsoleが呼び出される前に取得され、その間に他に何もする必要がないため):

let UptimeStopwatch = Stopwatch.StartNew()
System.Console.WriteLine(UptimeStopwatch.Elapsed)
于 2013-01-06T11:08:56.427 に答える