找回密码
 立即注册
首页 业界区 业界 DotTrace系列:2. 理解四大经典的诊断类型(下) ...

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

玻倌瞽 2025-6-22 13:09:57
一:背景

1. 讲故事

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

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

1. 一个简单的测试案例

为了方便演示,我们还是用上一篇的矩阵运算的例子,参考代码如下:
  1. using System;
  2. using System.Diagnostics;
  3. namespace MatrixOperations
  4. {
  5.     internal class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             const int baseSize = 1000;
  10.             const int iterations = 3;
  11.             for (int i = 0; i < iterations; i++)
  12.             {
  13.                 int matrixSize = baseSize - (i * 100);
  14.                 PerformMatrixMultiplication(matrixSize);
  15.             }
  16.         }
  17.         static void PerformMatrixMultiplication(int matrixSize)
  18.         {
  19.             Console.WriteLine($"\n=== 处理 {matrixSize}x{matrixSize} 矩阵 ===");
  20.             Console.WriteLine("创建随机矩阵...");
  21.             var matrixA = GenerateRandomMatrix(matrixSize, matrixSize);
  22.             var matrixB = GenerateRandomMatrix(matrixSize, matrixSize);
  23.             Console.WriteLine("执行矩阵乘法...");
  24.             var timer = Stopwatch.StartNew();
  25.             var resultMatrix = MultiplyMatrices(matrixA, matrixB);
  26.             timer.Stop();
  27.             Console.WriteLine($"运算完成,耗时: {timer.Elapsed.TotalSeconds:0.000} 秒");
  28.             DisplayMatrixPreview(resultMatrix);
  29.         }
  30.         static double[,] GenerateRandomMatrix(int rows, int cols)
  31.         {
  32.             var random = new Random();
  33.             var matrix = new double[rows, cols];
  34.             for (int i = 0; i < rows; i++)
  35.             {
  36.                 for (int j = 0; j < cols; j++)
  37.                 {
  38.                     matrix[i, j] = random.NextDouble() * 100;
  39.                 }
  40.             }
  41.             return matrix;
  42.         }
  43.         static double[,] MultiplyMatrices(double[,] matrixA, double[,] matrixB)
  44.         {
  45.             int aRows = matrixA.GetLength(0);
  46.             int aCols = matrixA.GetLength(1);
  47.             int bCols = matrixB.GetLength(1);
  48.             if (matrixA.GetLength(1) != matrixB.GetLength(0))
  49.                 throw new ArgumentException("矩阵维度不匹配");
  50.             var result = new double[aRows, bCols];
  51.             for (int i = 0; i < aRows; i++)
  52.             {
  53.                 for (int j = 0; j < bCols; j++)
  54.                 {
  55.                     double sum = 0;
  56.                     for (int k = 0; k < aCols; k++)
  57.                     {
  58.                         sum += matrixA[i, k] * matrixB[k, j];
  59.                     }
  60.                     result[i, j] = sum;
  61.                 }
  62.             }
  63.             return result;
  64.         }
  65.         static void DisplayMatrixPreview(double[,] matrix, int previewSize = 3)
  66.         {
  67.             Console.WriteLine($"\n矩阵预览 (前{previewSize}x{previewSize}个元素):");
  68.             int rows = Math.Min(previewSize, matrix.GetLength(0));
  69.             int cols = Math.Min(previewSize, matrix.GetLength(1));
  70.             for (int i = 0; i < rows; i++)
  71.             {
  72.                 for (int j = 0; j < cols; j++)
  73.                 {
  74.                     Console.Write($"{matrix[i, j],8:0.00} ");
  75.                 }
  76.                 Console.WriteLine();
  77.             }
  78.         }
  79.     }
  80. }
复制代码
接下来打开 dotrace,选择 Timeline 模式,采样频次默认是 1000samples/s,即每秒1000次采样,这个相比 Sampling 模式的5~11s 要快得多,也让采集结果成倍的增加,如果你想采集的更密集些,可以设置为 8000 samples/sec,最后就是启动 Start,截图如下:
1.png


采集完成之后,就能看到如下的 采集结果界面,映入眼帘的就是
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册