是否有一个 .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&lt;T&gt; 的总执行统计信息。有什么方法可以获得MyFunc&lt;string&gt;MyFunc&lt;int&gt; 的单独执行统计信息?

【问题讨论】:

为什么你认为拥有这些信息会有用? 如果您的目标是找出可以解决的问题以加快执行速度(而不仅仅是测量它),那么this method will tell you. 如果您有数学倾向,here are the reasons why。跨度> 【参考方案1】:

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

如果您查看 generic definition 的方法,您会发现这个

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

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

在调用堆栈上,当我们有MyFunc 时,我们总是只能找到这是MyFunc&lt;T&gt;(T t),而没有任何关于参数(类型或形式)的信息。

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

【讨论】:

不幸的是,我试图分析的实际程序比我展示的示例复杂得多。它包含很多泛型类和方法。

以上是关于是否有一个 .Net C# 分析器可以报告通用方法的不同类型执行的单独统计信息?的主要内容,如果未能解决你的问题,请参考以下文章

像 C# 中的 MFC 通用控件插件?

C# - 获取通用列表的项目类型

C# 中是不是有带有参数约束的通用构造函数?

C#从反射类型实例化通用列表[重复]

C#操作XML的通用方法总结

C#操作XML的通用方法总结