标签: dottrace

如何让 dotTrace ConsoleProfiler 收集快照?

我在应用程序上运行 dotTrace 的 ConsoleProfiler ( dotTrace doc ) 并不断收到一条消息:

"分析在 60.906 秒内成功完成

未收集任何快照”。

我错过了什么?

控制台输出:

C:\JetBrainsCLT>ConsoleProfiler.exe dotTrace_Config.xml snapshot.dtp
Console Profiler 2016.1 build 105.0.20160414.155338 Copyright (C) 2011-2015 JetBrains s.r.o.

...

Profiling is successfully finished in 60.906 seconds
No snapshots have been collected
Run Code Online (Sandbox Code Playgroud)

dotTrace_Config.xml:

<root>
  <HostParameters type="LocalHostParameters" />
  <Argument type="StandaloneArgument">
    <Arguments IsNull="False">
    </Arguments>
    <FileName>C:\Sourcecode\Project\bin\Debug\Test.exe</FileName>
    <WorkingDirectory>C:\Sourcecode\Project\bin\Debug</WorkingDirectory>
    <Scope>
      <ProcessFilters />
    </Scope>
  </Argument>
  <Info type="PerformanceInfo">
    <MeasureType>Sampling</MeasureType>
    <MeterKind>Rdtsc</MeterKind>
    <InjectInfo>
      <SymbolSearch>
        <SearchPaths />
      </SymbolSearch>
      <Scope>
        <PatternFilters />
        <DenyAttributeFilters />
      </Scope>
    </InjectInfo>
  </Info>
  <CoreOptions type="CoreOptions">
    <CoreTempPath IsNull="False">
    </CoreTempPath> …
Run Code Online (Sandbox Code Playgroud)

.net dottrace

5
推荐指数
1
解决办法
677
查看次数

使用 Jet Brain 的 dotTrace 进行分析时,约 85.5% 的本机代码?

每当我进行会话(采样和时间线)时,它都会说整个执行的 70-80% 被本机代码占用。这似乎有点可疑,不太确定我是否遇到了有问题的环境(因为由于客观限制,我正在使用该死的 Windows 7),或者它实际上很好?

截屏:

performance-testing dottrace windows-7

5
推荐指数
1
解决办法
2535
查看次数

几天后应用程序性能下降,更多时间花在 ntdll.dll 上

我试图找出为什么我的应用程序随着时间的推移变得更慢。应用程序将要做的工作打包成可以并发执行的批处理。每一批都必须等待前一批完成。批处理在更新函数内每~30 毫秒执行一次。在代码中,它看起来像这样:

List<List<Action>> batches = new List<List<Action>>(); // class member

foreach (var batch in batches) // inside of the update function
{
    Parallel.ForEach(batch, action => action());
}
Run Code Online (Sandbox Code Playgroud)

几天后,我发现执行所有批处理所需的时间越来越长。起初,执行大约需要 15 毫秒,然后几天后它需要超过 100 毫秒。我的目标是找出执行时间不断增加的原因。

在调试的时候,我发现批次数量和每批次的动作数量保持不变。

使用 dotTrace 进行分析表明,有时批处理中的一个操作需要更长的时间,并且Parallel.ForEach将(并且应该)等到所有先前的操作完成。在启动应用程序后立即进行分析时,仅每隔几百次更新就会出现延迟。几天后,几乎每次更新都会发生延迟。

这是它在分析器中的样子;我用不同深浅的绿色标记了各个更新周期并给它们编号。如您所见,第二次更新有明显的延迟(黄色)。

主题概览

在黄色期间,没有其他线程在做工作(至少根据分析器)。当一个一个的选择线程时,除了一个线程之外的所有线程都不在一个动作上工作。正如您在下一张图片中看到的,仍在处理某个操作的线程没有显示任何 CPU 负载,并且所有时间都花在ntdll.dll.

在此处输入图片说明

在这种情况下,对 的调用GetEnumerator大约需要 24 毫秒,但我已经看到类似ToString()或ToArray()太多的函数冻结。

我观察到的相关内容:

  • 冻结与特定功能无关,可能发生在应用程序的任何部分
  • 花费的时间总是显示在 ntdll.dll
  • 通常发生在 GC 之后
  • 在分析时间内运行的所有 GC 都是 gen0
  • 被调用的函数分配内存

c# multithreading profiling garbage-collection dottrace

5
推荐指数
0
解决办法
364
查看次数

当我对一个程序进行采样时,它实际上运行得比不进行分析更快?

我使用DotTrace 4.5性能

发布模式下的时间:

 2400000000
 Basic: 00:00:08.8051103
 2400000000
 Five: 00:00:09.1561338
 2400000000
 Overload: 00:00:16.3740938
 2400000000
 IListtoFive: 00:00:15.5841445
Run Code Online (Sandbox Code Playgroud)

在发布模式下进行性能分析的时间.

 2400000000
 Basic: 00:00:01.0048224
 2400000000
 Five: 00:00:03.5416982
 2400000000
 Overload: 00:00:11.8009959
 2400000000
 IListtoFive: 00:00:11.2568770
Run Code Online (Sandbox Code Playgroud)

我的代码:

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

namespace testLineIndex
{

    class Program
    {
        static long Five(int s0, int s1, int s2, int s3, int s4)
        {
            return s4 + 100 * s3 + 10000 * s2 + 1000000 * s1 + 100000000 * s0;
        }

        static long Overload(IList<int> …
Run Code Online (Sandbox Code Playgroud)

c# performance profiling dottrace

4
推荐指数
1
解决办法
575
查看次数