【问题标题】:Self-Profiling using Proxy class使用代理类进行自我分析
【发布时间】:2010-10-07 19:07:20
【问题描述】:

给定一个接口

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 时间可能已在另一个节点上消耗的事实。

【问题讨论】:

    标签: c# performance profiling


    【解决方案1】:

    如果您尝试分析性能而不是从给定方法开始,请获取像 Ants 分析器这样的实际配置文件,并查看真正的瓶颈在哪里。很多时候,当您假设您的应用程序性能不佳时,您最终会查找和优化所有错误的地方,从而浪费大量时间。

    【讨论】:

    • “没有外部分析器”。树是动态构建的,因此每个用例的瓶颈可能不同。
    • 这很好,因为您只需运行分析器,然后以各种方式运行它,然后查看整个系统的情况。我提出这个的原因是因为尝试优化而不进行分析通常总是浪费时间。使用分析器,然后进行优化。
    • 所以你认为我应该告诉客户安装一个分析器,告诉他时间花在哪个节点上?
    • 客户运行时有何不同?代码就是代码。你不需要在生产系统上分析它,在你的测试盒上分析它,你会看到所有的瓶颈。开始解决这些问题,然后您就会看到生产方面的世界差异。
    • 或者您是在尝试对您的软件或您的软件的某些子系统进行基准测试,而您实际上并没有尝试优化任何东西?
    【解决方案2】:

    你没有说你期望每个 GetValue 电话多快完成,所以很难给出任何明确的建议......

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

    我不知道有什么方法可以避免因执行其他流程而引入的失真。我通常只计算我感兴趣的每个特定部分的平均运行时间,尽可能多地平均运行(以消除由其他进程和任何计时器不准确引起的变化)。

    (在本机代码中,为了分析不需要很长时间执行的事情,我通过 RDTSC 指令使用 CPU 周期计数器。因此,如果您正在计时的东西过早结束,其他计时器无法获得一个有用的阅读,但不会很快完成调用开销是一个问题,并且您不介意以 CPU 周期而不是任何标准时间单位获取读数,可能值得编写一个返回周期的小本机函数UInt64 中的计数器值。虽然我自己不需要在托管代码中执行此操作...)

    【讨论】:

    • 我预计 GetValue 的响应时间通常在纳秒范围内。
    • 分辨率并未声称为每秒 10,000,000 滴答。滴答的定义是 1/10,000,000 秒,但(根据 MSDN)分辨率取决于系统计时器 - Windows 98 为 55 毫秒,Windows NT(3.5 及更高版本)为 10 毫秒。
    • 所有这些似乎都无济于事,因为据说执行是并行的,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多