Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用代理类进行自分析_C#_Performance_Profiling - Fatal编程技术网

C# 使用代理类进行自分析

C# 使用代理类进行自分析,c#,performance,profiling,C#,Performance,Profiling,给定一个接口 public interface IValueProvider { object GetValue(int index); } 以及类似于数学表达式树的IValueProvider实例的树结构。 我想在没有外部探查器的情况下测量运行时每个节点的GetValue方法所花费的时间 GetValue可以做任何我在设计时不知道的事情:从其他IvalueProvider收集值,运行IronPython表达式,甚至是一个外部插件。我想向用户展示有关节点计时的统计信息 为此,我可以创建一个

给定一个接口

public interface IValueProvider
{
  object GetValue(int index);
}
以及类似于数学表达式树的IValueProvider实例的树结构。 我想在没有外部探查器的情况下测量运行时每个节点的GetValue方法所花费的时间

GetValue可以做任何我在设计时不知道的事情:从其他IvalueProvider收集值,运行IronPython表达式,甚至是一个外部插件。我想向用户展示有关节点计时的统计信息

为此,我可以创建一个封装IValueProvider的代理类:

public class ValueProviderProfiler : IValueProvider
{
  private IValueProvider valueProvider;

  public object GetValue(int index)
  {
    // ... start measuring
    try
    {
      return this.valuepProvider.GetValue(index);
    }
    finally
    {
      // ... stop measuring
    }
  }
}
在没有外部过程造成的扭曲的情况下,以良好的准确性并考虑到并行评估节点的事实,测量节点花费的时间的最佳方法是什么


仅仅使用Stopwatch类是不起作用的,并且查看进程的处理器时间并不考虑cpu时间可能在另一个节点上被消耗的事实。

您没有说每个
GetValue
调用完成的速度有多快,所以很难给出任何明确的建议

对于需要几毫秒的事情(磁盘访问、填充控件、网络传输等),我使用了
DateTime.Ticks.Now
。它似乎工作得相当好,声称每秒10000000个滴答声的分辨率听起来相当不错。(但我怀疑它是否真的那么精确;我不知道它是由什么设施支持的。)

我不知道有什么方法可以避免执行其他进程所带来的扭曲。我通常只取运行我感兴趣的每个特定部分所花费的平均时间,在尽可能多的运行中求平均值(以消除其他进程和任何计时器不准确造成的变化)


(在本机代码中,为了分析执行时间不长的内容,我通过
RDTSC
指令使用CPU周期计数器。因此,如果您正在计时的内容结束得太快,其他计时器无法获得有用的读数,但完成得太快,因此调用开销是一个问题,并且您不介意以CPU周期获取读数。)与任何标准时间单位相比,编写一个在
UInt64
中返回循环计数器值的本机函数是值得的。不过,我自己不需要在托管代码中这样做……)

如果您试图分析性能,而不是从给定的方法开始,那么请获得一个实际的配置文件,如Ants profiler,并查看真正的瓶颈所在。很多时候,当您假设应用程序无法运行的原因时,您最终会查找和优化所有错误的位置,并浪费大量时间

“没有外部分析器"。树是动态构建的,因此每个用例的瓶颈可能不同。这很好,因为您只需运行探查器,然后以各种方式运行它,并查看整个系统中的情况。我之所以提出此问题,是因为尝试在不进行剖析的情况下进行优化通常都是浪费时间。请使用pro文件管理器,然后进行优化。因此,您认为我应该告诉客户安装一个探查器,告诉他在哪个节点花费了时间?客户运行它时有什么不同?代码就是代码。您不需要在生产系统上分析它,在测试盒上分析它,您将看到%明智的所有瓶颈。Start解决这些问题,然后您就可以看到生产上的世界差异。或者您是在尝试基准测试您的软件或软件的某些子系统,而实际上您并没有尝试优化任何东西?我预计GetValue的响应时间通常在纳秒范围内。分辨率并不是声称为10000000 ticks p呃秒。滴答声的定义是1/10000000秒,但是(根据MSDN)分辨率取决于系统计时器-Windows 98为55毫秒,Windows NT为10毫秒(3.5及更高版本)。所有这些似乎都没有帮助,因为据说执行是并行的,不是吗?