玻倌瞽 发表于 2025-6-22 13:09:57

DotTrace系列:2. 理解四大经典的诊断类型(下)

一:背景

1. 讲故事

前面我们已经聊过四大诊断类型中的前三个 Sampling,Tracine,Line-by-Line,这篇补上最后一个诊断类型 Timeline,这也是真实场景中使用最多的,它能够采集到所有它能采集到的,比如:

[*]线程栈数据 (函数执行时间)
[*]ETW事件 (Windows日志)
[*]TPL数据(方便绘制异步栈)
[*]按时序绘制时间轴 (Timeline)
二:Timeline 解读

1. 一个简单的测试案例

为了方便演示,我们还是用上一篇的矩阵运算的例子,参考代码如下:
using System;
using System.Diagnostics;

namespace MatrixOperations
{
    internal class Program
    {
      static void Main(string[] args)
      {
            const int baseSize = 1000;
            const int iterations = 3;

            for (int i = 0; i < iterations; i++)
            {
                int matrixSize = baseSize - (i * 100);
                PerformMatrixMultiplication(matrixSize);
            }
      }

      static void PerformMatrixMultiplication(int matrixSize)
      {
            Console.WriteLine($"\n=== 处理 {matrixSize}x{matrixSize} 矩阵 ===");

            Console.WriteLine("创建随机矩阵...");
            var matrixA = GenerateRandomMatrix(matrixSize, matrixSize);
            var matrixB = GenerateRandomMatrix(matrixSize, matrixSize);

            Console.WriteLine("执行矩阵乘法...");
            var timer = Stopwatch.StartNew();

            var resultMatrix = MultiplyMatrices(matrixA, matrixB);

            timer.Stop();
            Console.WriteLine($"运算完成,耗时: {timer.Elapsed.TotalSeconds:0.000} 秒");

            DisplayMatrixPreview(resultMatrix);
      }

      static double[,] GenerateRandomMatrix(int rows, int cols)
      {
            var random = new Random();
            var matrix = new double;

            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                  matrix = random.NextDouble() * 100;
                }
            }

            return matrix;
      }

      static double[,] MultiplyMatrices(double[,] matrixA, double[,] matrixB)
      {
            int aRows = matrixA.GetLength(0);
            int aCols = matrixA.GetLength(1);
            int bCols = matrixB.GetLength(1);

            if (matrixA.GetLength(1) != matrixB.GetLength(0))
                throw new ArgumentException("矩阵维度不匹配");

            var result = new double;

            for (int i = 0; i < aRows; i++)
            {
                for (int j = 0; j < bCols; j++)
                {
                  double sum = 0;
                  for (int k = 0; k < aCols; k++)
                  {
                        sum += matrixA * matrixB;
                  }
                  result = sum;
                }
            }

            return result;
      }

      static void DisplayMatrixPreview(double[,] matrix, int previewSize = 3)
      {
            Console.WriteLine($"\n矩阵预览 (前{previewSize}x{previewSize}个元素):");

            int rows = Math.Min(previewSize, matrix.GetLength(0));
            int cols = Math.Min(previewSize, matrix.GetLength(1));

            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                {
                  Console.Write($"{matrix,8:0.00} ");
                }
                Console.WriteLine();
            }
      }
    }
}接下来打开 dotrace,选择 Timeline 模式,采样频次默认是 1000samples/s,即每秒1000次采样,这个相比 Sampling 模式的5~11s 要快得多,也让采集结果成倍的增加,如果你想采集的更密集些,可以设置为 8000 samples/sec,最后就是启动 Start,截图如下:


采集完成之后,就能看到如下的 采集结果界面,映入眼帘的就是
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: DotTrace系列:2. 理解四大经典的诊断类型(下)