我是个新手,但是我写的一个小的程序上串C#而且我注意到,如果我做了一些事情以不同的方式,执行的代码显着加快。

所以我想知道你怎么去时代码的执行速度?是否有任何(免费)公用事业?你去关于它的古老的方式与一系统。定时器和自己做的?

有帮助吗?

解决方案

您所描述的内容称为性能分析。您可以执行许多程序,例如 Jetbrains profiler 蚂蚁分析器,尽管大多数人会在测量其性能的过程中减慢您的应用程序。

要手动滚动自己的性能分析,可以使用 System.Diagnostics.Stopwatch 和一个简单的Console.WriteLine,就像你描述的那样。

另外请记住,C#JIT编译器根据调用的类型和频率优化代码,因此请使用不同大小和方法的循环,例如递归调用,以了解哪种方法效果最佳。

其他提示

来自RedGate的ANTS Profiler 是一款非常不错的性能分析器。来自JetBrains的 dotTrace Profiler 也很棒。通过这些工具,您可以查看可以在每条线上钻取的性能指标。

ANTS Profiler的Scree镜头: ANTS http://www.red-gate.com/products/ ants_profiler /图像/应用/ timeline_calltree3.gif

如果您想确保在单元测试期间特定方法保持在特定性能阈值内,我会使用 秒表,在一个循环中监视一次方法的执行时间,计算平均值,然后 断言 反对结果。

只是提醒一下 - 确保在Release中编译,而不是Debug! (我看到经验丰富的开发人员犯了这个错误 - 很容易忘记)。

你在描述什么是'性能调整'。当我们谈论性能调优时,它有两个角度。 (a)响应时间 - 执行特定请求/程序所需的时间。 (b)吞吐量 - 一秒钟内可以执行多少个请求。当我们通常“优化”时 - 当我们消除不必要的处理时,响应时间和吞吐量都会提高。但是,如果您的代码中有等待事件(如Thread.sleep(),I / O等等),则响应时间会受到影响,但吞吐量不会受到影响。通过采用并行处理(产生多个线程),我们可以缩短响应时间,但不会提高吞吐量。通常,对于服务器端应用程序,响应时间和吞吐量都很重要对于桌面应用程序(如IDE),吞吐量并不重要,只有响应时间很重要。

您可以通过“效果测试”来衡量响应时间 - 您只需记下所有关键交易的响应时间。您可以通过“负载测试”来测量吞吐量 - 您需要从足够多的线程/客户端连续地抽取请求,以便服务器计算机的CPU使用率为80-90%。当我们提出请求时,我们需要保持不同交易之间的比率(称为交易组合) - 例如:在预订系统中,每100次搜索将有10次预订。每10次预订会有一次取消等。

在确定需要调整响应时间(性能测试)的事务后,您可以使用分析器识别热点。 您可以通过比较该事务的响应时间*分数来确定吞吐量的热点。假设在搜索,预订,取消方案中,比例为89:10:1。 响应时间为0.1秒,10秒和15秒。 加载搜索 - 0.1 * .89 = 0.089 预订负载 - 10 * .1 = 1 对于Cancell = 15 * .01 = 0.15的加载 调整预订将对吞吐量产生最大影响。 您还可以通过重复进行线程转储(在基于Java的应用程序的情况下)来识别吞吐量的热点。

使用一个分析器。

如果你需要时间的一个具体的方法只有秒表类可能是一个好的选择。

我做了以下事情: 1)我使用ticks(例如在VB.Net Now.ticks中)来测量当前时间。我从完成的刻度值中减去起始刻度并除以TimeSpan.TicksPerSecond以获得它花了多少秒。 2)我避免UI操作(如console.writeline)。 3)我在一个实质性循环(如100,000次迭代)上运行代码,尽可能地分解使用/操作系统变量。

您可以使用StopWatch类来计算方法。请记住,由于代码必须被咬合,第一次通常很慢。

有一个本机.NET选项(面向软件开发人员的Team Edition)可能会满足一些性能分析需求。从2005 .NET IDE菜单中,选择Tools-> Performance Tools-> Performance Wizard ...

[GSS可能是正确的,您必须拥有团队版]

这是测试代码速度的简单示例。我希望我帮助你

class Program {
    static void Main(string[] args) {
        const int steps = 10000;
        Stopwatch sw = new Stopwatch();

        ArrayList list1 = new ArrayList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list1.Add(i);
        }
        sw.Stop();
        Console.WriteLine("ArrayList:\tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);

        MyList list2 = new MyList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list2.Add(i);
        }
        sw.Stop();
        Console.WriteLine("MyList:  \tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top