如何使用Visual Studio 2008 Profiler工具分析一个库解决方案?

时间:2009-02-25 16:46:00

标签: visual-studio-2008 profiler

我已阅读并练习MSDN's Profiler Tutorial。但是我找不到一种方法来分析库解决方案(对于库,禁用了“启动分析”按钮)。

  1. 到目前为止,我能想到的唯一解决方案是创建一个可执行项目,仅用于分析目的。
  2. 我已经使用Visual Studio Team System的测试框架为我的库编写了单元测试,所以我想我可以将它们用于配置文件,就像Rick Minerich对NUnit一样。
  3. 任何人都能指出正确的方向吗?

5 个答案:

答案 0 :(得分:4)

可以使用您的测试进行分析。您只需在启动测试的任何内容上运行探查器,并将您要成为待定的程序集指定为探查器目标。但是,如果不确切知道您正在使用哪种基础设施进行测试和分析,那么几乎不可能指出您的解决方案。

因为我使用NUnit,我会以它为例。您可以创建一个测试类别并将其称为配置文件测试。然后,您可以使用/ include命令行选项从分析器运行nunit.exe以指定这些测试:

nunit-console myassembly.dll /include:Profile

您可以使用Analyize-> Performance Wizard执行此操作。 dll路径将是您的程序集,可执行路径将是如上所述的nunit-console命令行。

我也知道ReSharper adds extensions to Visual Studio to do this for you。有了它,您可以右键单击测试并选择“Profile TESTNAME”。虽然它确实需要花钱,但我认为你可以查看一个评估版本。

另外,请注意,请务必使用发布库进行概要分析。发布和调试通常具有多种不同的性能配置文件。

答案 1 :(得分:0)

分析是一种运行时技术,所以如果我理解你必须运行你的软件,这样你就可以运行时对它进行分析。

您也无法正常运行库,最简单的选择是运行测试或创建使用库的简单exe。您可以只检测dll,以便只在需要的位置进行配置。

答案 2 :(得分:0)

这没有多大意义。 Visual Studio探查器不会对代码执行静态分析以报告其速度。它允许您运行它,检测代码或获取运行代码的样本,以估计每个代码段的使用时间。

鉴于此,你会如何建议你的图书馆? Visual Studio如何了解您的测试以及您希望运行哪些测试以进行性能分析?

答案:你制作一个可执行文件并调用这些测试,这就是它所知道的。

答案 3 :(得分:0)

默认情况下,所有项目都必须进行程序测试。这是练习代码的简单模式。现在你应该考虑涵盖条目的所有可能性。他还将使用覆盖工具。

答案 4 :(得分:0)

实际上,您可以添加目标列表(右键单击Targets)任何可执行文件。

Program.cs的文本非常简单:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            YourDllLibrary.Tests.TestClass t = new YourDllLibrary.Tests.TestClass();
            t.Init();
            MethodInfo[] m = t.GetType().GetMethods();
            for (int i = 0; i < m.Length; i++)
            {
                MethodInfo mi = m[i];

                if (mi.DeclaringType.Name != t.GetType().Name )
                    continue;

                if(Attribute.GetCustomAttribute(mi, 
                    typeof(Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute)) == null)
                    continue;

                try
                {
                    Console.Write(mi.Name + " - ");
                    mi.Invoke(t, null);
                    Console.WriteLine("passed");
                }
                catch
                {
                    Console.WriteLine("failed");
                }
            }
        }

    }
}