【问题标题】:Code Instrumentation on an ASP.NET Web ApplicationASP.NET Web 应用程序上的代码检测
【发布时间】:2010-11-15 02:14:54
【问题描述】:

总的来说,我对 .NET 开发还很陌生。我想在我的 Web 应用程序上做一些检测来调整性能,尤其是在缓存方面。我已经编写了很多自定义动态生成的 UserControl,我想尝试以不同的方式缓存它们——可能通过 ASPX 页面声明或以编程方式。

我还有很多相互依赖的 Oracle 查询,我想研究一下这些查询的缓存结果,看看哪些可以提供最佳的性能提升。

解决此问题的最佳方法是什么?不知何故,我不认为使用秒表来查看 IE 加载页面需要多长时间是最好的主意。除了感知延迟之外,我不知道我的缓存是否受到打击或错过。 VS2008 有内置工具来辅助吗?

【问题讨论】:

    标签: .net asp.net visual-studio-2008 caching instrumentation


    【解决方案1】:

    我最近工作的一个项目需要检查我们的 SQL 查询的时间,并在调试模式下将它们输出到调试侦听器。通过这种方式,我们可以评估 SQL 查询的时间和执行时间,以及调试我们的网站代码。

    我通过将 SQL 查询集中到我们使用的 3 种 SQL 方法的包装方法中来做到这一点:

    • 执行查询
    • ExecuteNonQuery
    • ExecuteScalar

    他们确实使用了 Stopwatch 类,但也有将查询转换为 SQL 语句的代码,类似于 SQL Server Profiler 中看到的代码。

    每种方法都类似于以下内容:

    protected static object ExecuteScalar(SqlCommand comm, SqlParameter[] sqlParameters)
    {
        Stopwatch st = new Stopwatch();
        bool errorDetected = false;
    
        try
        {
             comm.Parameters.Add(sqlParameters);
    
             using(comm)
             {
                  st.Start();
                  object returnValue = comm.ExecuteScalar();
                  st.Stop();
                  return returnValue;
             }
        }
        catch(Exception)
        {
             errorDetected = true;
             st.Stop();
             throw;
        }
        finally
        {
             string output = GetSqlStringForParameters(sqlParameters,st.Elapsed,QueryType.Scalar);
    
             if(errorDetected)
             {
                  Debug.WriteLine("/*SQL (Errored)*/" + output,"DataAccess.SqlAdapter.ExecuteScalar");
             }
             else
             {
                  Debug.WriteLine("/*SQL*/" + output,"DataAccess.SqlAdapter.ExecuteScalar");
             }
        } 
    }
    

    这将在 DebugView.exe 中输出我们的 SQL 语句,如下所示:

    /*SQL*/ exec spsGetOrder @OrderNumber='234567' -- Rows returned = 1 ;  1 params |--> completed NonQuery in 0.0016144 seconds. 
    

    这样做的好处在于,虽然这些语句存在瓶颈,但我们可以将查询直接粘贴到 SQL 分析器中并获取查询的输出。这也意味着如果你有查看日志文件的工具,你可以使用正则表达式来监控在某个范围内所花费的时间。

    因此,如果您想查找耗时超过 0.5 秒的查询,您可以搜索该词:

    "in 0.[5-9]\d+"

    这极大地帮助我们集中精力。它还可以帮助我们确定问题是否与数据库相关,或者如上所述,是 ASP.NET 问题。

    最后,还有一个名为Fiddler 的工具,它还可以帮助您在页面进入您的计算机时对其进行诊断。这会为您提供文件大小、对图像/css 的引用、下载时间等信息。这对于诊断 ViewState 大小问题也非常有用。

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      我通常采用的方法是启用 ASP.NET 跟踪。启用this here 有一个很好的指南。它非常详细,最重要的是它是免费的。

      要关注的一件事是页面的大小(尤其是其视图状态),这是代码执行后页面下载所需时间的重要部分。另一个是代码的某些部分的渲染速度,可以通过在代码进行性能测试之前和之后调用Trace.Write 来实现。

      使用 ASP.NET 跟踪的性能测试部分实际上只是一个指南,因为它不容易重复,但仍然是一个很好的指南。如果您想更进一步,Visual Studio 2008 Team System 中的一些工具可能会更好(尽管我没有使用过这些工具)。还有JetBrains dotTraceANTS Profiler

      【讨论】:

        【解决方案3】:

        AppDynamics 是一款非常出色的应用程序性能监视器,无需配置即可检测您的 .NET 应用程序。我认为将可以使用该工具解决您的问题。 http://www.appdynamics.com/

        【讨论】:

          【解决方案4】:

          我对@9​​87654321@ 的体验非常好。他们网站上的安装非常简单,仪表板非常清晰,如果您碰巧托管在 Rackspace 或 Amazon Clouds 上,他们通常会免费升级到 Pro 帐户。看看他们!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-17
            • 1970-01-01
            • 1970-01-01
            • 2010-09-21
            • 1970-01-01
            相关资源
            最近更新 更多