2

簡単なプログラムがあるとします:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ProfilerTesting
{
    class Program
    {
        static void MyFunc<T>(T t)
        {
            System.Threading.Thread.Sleep(100);
            Console.WriteLine(t);
        }

        static void Main(string[] args)
        {
            IList<string> l = new List<string> { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m" };
            foreach (string s in l)
            {
                MyFunc(s);
            }

            IList<int> g = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
            foreach (int i in g)
            {
                MyFunc(i);
            }
        }
    }
}

サンプリング モードで .Net プロファイラー (私は EQUATEC プロファイラー フリー バージョンと Visual Studio パフォーマンス ツールの両方を試しました) を使用してこのプログラムをプロファイリングすると、合計実行統計MyFunc<T>のみが得られます。と の個別の実行統計を取得する方法はありMyFunc<string>ますMyFunc<int>か?

4

1 に答える 1

1

私はこれを行うことができるツールを知りませんし、実際にこれが可能になるとは思いません。

メソッドの一般的な定義を見てみると、これが見つかります

ジェネリック メソッド定義は、ジェネリック型パラメーターのリストと仮パラメーターのリストの 2 つのパラメーター リストを持つメソッドです。次のコードに示すように、型パラメーターは、戻り値の型または仮パラメーターの型として表示されます。

あなたの質問は、「コール スタック関数を異なるパラメーター値で区別することは可能ですか?」と言い換えることができます。答えはノーです。もちろん、これは何とか可能ですが、非常に膨大な量のデータであり、このデータを分析するのは非常に難しいため、誰もこれを実装しません。

呼び出しスタックでは、パラメーター (型または形式) に関する情報がなくても、MyFunc常に this であることがわかります。MyFunc<T>(T t)

あなたのケースでは、パフォーマンスを別々に測定したい場合は、このメソッドを 2 つに分けたほうがよいでしょう。

于 2013-04-09T07:06:05.933 に答える