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

我不知道有什么工具可以做到这一点,而且我实际上不认为这是可能的。

如果您查看方法的通用定义,您会发现

泛型方法定义是具有两个参数列表的方法:泛型类型参数列表和形式参数列表。类型参数可以作为返回类型出现,也可以作为形式参数的类型出现,如下面的代码所示。

我们可以将您的问题改写为“是否可以通过不同的参数值来区分调用堆栈函数?”。答案是否定的。当然这在某种程度上是可能的,但是没有人会实现它,因为它是非常庞大的数据量,并且很难分析这些数据。

在调用堆栈上,MyFunc我们总是只能找到 this is MyFunc<T>(T t),而没有任何关于参数(类型或形式)的信息。

对于您的情况,如果您想单独测量性能,最好将此方法一分为二。

于 2013-04-09T07:06:05.933 回答