3

我已经阅读并练习了MSDN 的 Profiler Tutorial。但我找不到分析库解决方案的方法(库禁用了“使用分析启动”按钮)。

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

谁能指出我正确的方向?

4

5 回答 5

4

可以使用您的测试进行分析。您只需在启动测试的任何地方运行探查器,并将您的要探查的程序集指定为探查器目标。但是,如果不确切知道您用于测试和分析的基础架构,则几乎不可能为您指明解决方案。

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

nunit-console myassembly.dll /include:Profile

您可以使用分析-> 性能向导来执行此操作。dll 路径将是您的程序集,而可执行路径将是上面提到的 nunit-console 命令行。

我还知道ReSharper 为 Visual Studio 添加了扩展来为您执行此操作。有了它,您只需右键单击一个测试并选择“Profile TESTNAME”。虽然确实要花钱,但我认为您可以查看评估版本。

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

于 2009-03-03T17:27:21.990 回答
0

分析是一种运行时技术,所以如果我理解得很好,你必须运行你的软件,这样你才能运行时分析它。

您也不能正常运行库,最简单的选择是运行测试或创建使用该库的简单 exe。您可以仅检测 dll,以便仅在您想要的位置进行分析。

于 2009-03-03T17:03:32.890 回答
0

这没有多大意义。Visual Studio 探查器不会对您的代码执行静态分析来报告它的速度。它允许您运行它,并检测代码或对运行的代码进行采样,以估计每个代码部分需要多长时间。

鉴于此,您将如何描述您的图书馆?Visual Studio 如何知道您的测试,以及您想要运行哪些测试以进行分析?

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

于 2009-03-03T17:07:49.010 回答
0

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

于 2009-03-06T13:23:48.400 回答
0

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

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");
                }
            }
        }

    }
}
于 2010-01-07T23:18:41.230 回答