PerfView系列之探究cpu爆高原因

  • 今天我们用PerfView来探究一下程序cpu爆高的原因,首先构建一个模拟cpu爆高的程序

    internal class Program
    {
        static void Main(string[] args)
        {
            Task.Run(() => Test1());    //Test1 故意死循环
            Task.Run(() => Test2());    //Test2 是一个正常函数
    
            Console.WriteLine("我是主线程!");
            Console.ReadLine();
        }
    
        static void Test1()
        {
            var i = 10;
            var b = true;
    
            while (i > 0)
            {
                b = !b;
            }
        }
    
        static void Test2()
        {
            for (int i = 0; i < 10000; i++)
            {
                var j = string.Join(",", Enumerable.Range(0, 100));
            }
            Console.WriteLine("Test2执行结束");
        }
    }
    
  • 打开 PerfView,并设置要指定运行的程序,并且设置1ms对cpu进行采样一次,采样总时长为15秒

  • 设置好后点击 Run Command 开始采样,主界面会卡住一段时间,耐心等待采样结束即可

  • 采样结束后,左侧的资源列表中会出现一个 PerfViewData.etl.zip,双击打开后再双击打开 CPU Stacks

  • 双击 CPU Stacks 之后会出现一个弹窗,列出所有的进程的CPU运行相关信息,找到我们模拟的那个进程(一般第一个)并再次双击

  • 在这个弹窗中,我们就能看到导致CPU爆高的热点函数

    • 可以看出,simulatecpuhighusage!SimulateCpuHighUsage.Program.Test1() 函数是导致cpu爆高的热点函数

posted on 2025-04-20 22:07  baby-jie  阅读(220)  评论(0)    收藏  举报