2014年06月11日

C#で実行時間の測定

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その15

■問題  (出題者:にしお さん)

ある比較的重たい処理をする関数「func」があるとします。 この関数を呼び出して、その実行にかかった時間を表示する関数「profile」を書いてください。 言語として可能であれば、「profile」が「func」と同じ引数で呼び出せるようにしてください。


なかなか面白い問題ですね。
ここでは、func1, func2 の2つのメソッドを呼び出し、それぞれの時間計測をするコードを書いています。
C#らしく profile関数ではなく、Profileクラスを作成してみました。 引き数の数も自由ですし、戻り値も返せます。 

■C#で書いたコード
using System;
using System.Reflection;
using System.Diagnostics;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            {
                var profile = new Profile(new Func<string, int>(func1));
                var r = profile.Call("Hello world");
                Console.WriteLine("結果={0}",r);
                Console.WriteLine("実行時間={0}",profile.Elapsed);
            }
            Console.WriteLine();
            {
                var profile = new Profile(new Func<int, int, string>(func2));
                var r = profile.Call(123, 456);
                Console.WriteLine("結果={0}", r);
                Console.WriteLine("実行時間={0}", profile.Elapsed);
            }
        }

        static int func1(string s) {
            Console.WriteLine(s);
            return s.Length;
        }

        static string func2(int n1, int n2) {
            Console.WriteLine(n1);
            Console.WriteLine(n2);
            return (n1 + n2).ToString();
        }
    }

    // 時間計測クラス
    class Profile {
        private MethodInfo methodInfo;

        // コンストラクタ
        // 引き数には、時間計測したいメソッドを渡す。
        public Profile(Delegate func) {
            this.methodInfo = func.Method;
        }

        // コンストラクタで指定したメソッドを呼び出し、その時間を計測する。
        // 計測時間は、Elapsedプロパティにセットする。
        public object Call(params object[] args) {
            Stopwatch sw = Stopwatch.StartNew();
            var r = methodInfo.Invoke(null, args);
            Elapsed = sw.Elapsed;
            return r;
        }

        public TimeSpan Elapsed { get; private set; }
    }
}


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52370110