一:背景
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[rows, cols];
- for (int i = 0; i < rows; i++)
- {
- for (int j = 0; j < cols; j++)
- {
- matrix[i, j] = 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[aRows, bCols];
- 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[i, k] * matrixB[k, j];
- }
- result[i, j] = 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[i, j],8:0.00} ");
- }
- Console.WriteLine();
- }
- }
- }
- }
复制代码 接下来打开 dotrace,选择 Timeline 模式,采样频次默认是 1000samples/s,即每秒1000次采样,这个相比 Sampling 模式的5~11s 要快得多,也让采集结果成倍的增加,如果你想采集的更密集些,可以设置为 8000 samples/sec,最后就是启动 Start,截图如下:
采集完成之后,就能看到如下的 采集结果界面,映入眼帘的就是
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |