スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門基本編落穂拾い その6 (実行時間を計る)

関数の実行時間を計るには例えば次のような関数を準備しておけばいいようです。
 
>let time f x =
    let timer = new System.Diagnostics.Stopwatch()
    timer.Start()
    try 
        f x 
    finally
        printfn "%dmsかかりました" timer.ElapsedMilliseconds
;;
 
val time : ('a -> 'b) -> 'a -> 'b
 
使用例
 
> time (fun () -> List.fold (+) 0L [1L ..10000000L]) () ;;
11920msかかりました
val it : int64 = 50000005000000L
 
使用例
 
> let sum x =
    let mutable s = 0L
    for i in 0L .. x do
        s <- s + i
    s ;;
 
val sum : int64 -> int64
 
> time sum 10000000L;;
5803msかかりました
val it : int64 = 50000005000000L
 
またF#Interactiveでは、#time宣言することで、実行時間が測れます。
 

 
> #time;;
--> Timing now on
 
> List.fold (+) 0L [1L ..10000000L];;
Real: 00:00:12.018, CPU: 00:00:12.453, GC gen0: 282, gen1: 141, gen2: 3
val it : int64 = 50000005000000L
(GCというのは、不要になった、ヒープ上のメモリを解放するガーベッジコレクションのことです。)
 
オフにするにはもう一度#timeと打ち込みます。
 
> #time;;
--> Timing now off
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

No title

lazy 使うといいかも・・(どれくらいlazy によるロスがあるかは知らんけど)
let time (lzy:Lazy<_>) =
let timer = new System.Diagnostics.Stopwatch()
timer.Start()
try
lzy.Force()
finally
printfn "%dmsかかりました" timer.ElapsedMilliseconds

No title

ちなみに、上の計算をもう一度やってみると。

> time (fun () -> List.fold (+) 0L [1L ..10000000L]) () ;;
4266msかかりました
val it : int64 = 50000005000000L
(β2で、えらく早くなってます。)

> let test = lazy( List.fold (+) 0L [1L ..10000000L]);;
val test : Lazy<int64> = Value is not created.

としてBLUEPIXYさんのtimeでやってみると、

> time test;;
4898msかかりました
val it : int64 = 50000005000000L

という結果でした。
ちなみに下側の例は5803ms->667msという結果となりました。(他の影響もあるかもしれませんが、なんか早すぎ)

No title

バージョンアップして、かりかりッにチューンされているんですね?!

私は、今しばらく、1.96.16(もう一つ更に古い・)でいようと思います。
プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。