是否有一个 .Net C# 分析器可以报告通用方法的不同类型执行的单独统计信息?
Posted
技术标签:
【中文标题】是否有一个 .Net C# 分析器可以报告通用方法的不同类型执行的单独统计信息?【英文标题】:Is there a .Net C# profiler that can report separate statistics for different typed execution of a generic method? 【发布时间】:2013-04-09 04:51:27 【问题描述】:假设我有一个简单的程序:
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>
的单独执行统计信息?
【问题讨论】:
为什么你认为拥有这些信息会有用? 如果您的目标是找出可以解决的问题以加快执行速度(而不仅仅是测量它),那么this method will tell you. 如果您有数学倾向,here are the reasons why。跨度> 【参考方案1】:我不知道有什么工具可以做到这一点,而且我实际上也不认为这是可能的。
如果您查看 generic definition 的方法,您会发现这个
泛型方法定义是具有两个参数列表的方法:泛型类型参数列表和形式参数列表。类型参数可以作为返回类型出现,也可以作为形式参数的类型出现,如下代码所示。
我们可以将您的问题改写为“是否可以通过不同的参数值来区分调用堆栈函数?”。答案是否定的。当然这在某种程度上是可能的,但是没有人会实现它,因为它是非常庞大的数据量,并且很难分析这些数据。
在调用堆栈上,当我们有MyFunc
时,我们总是只能找到这是MyFunc<T>(T t)
,而没有任何关于参数(类型或形式)的信息。
对于您的情况,如果您想单独衡量性能,最好将此方法一分为二。
【讨论】:
不幸的是,我试图分析的实际程序比我展示的示例复杂得多。它包含很多泛型类和方法。以上是关于是否有一个 .Net C# 分析器可以报告通用方法的不同类型执行的单独统计信息?的主要内容,如果未能解决你的问题,请参考以下文章