0Pricing
C# Academy · Урок

Основы профилирования и трассировки (концепции)

Измеряйте код с помощью Stopwatch, создавайте небольшие области измерения времени, разберитесь в идентификаторах корреляции трассировки и изучите основы аккуратного микротестирования производительности.

«Основы профилирования и трассировки (концепции)» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.

Основы измерения времени и трассировки

Цель:

  • Измерять наиболее нагруженные участки с помощью секундомера
  • Добавлять небольшие области измерения времени для блоков кода
  • Использовать идентификаторы корреляции трассировки для связывания событий
  • Избегать избыточных измерений

Демонстрация секундомера

Используйте секундомер для измерения времени выполнения кода; сначала прогрейте код, а затем повторяйте операцию, чтобы сгладить влияние JIT.

using System;
using System.Diagnostics;
using System.Threading;

// Simple loop timing with warmup; C# 6 compatible.
public class Program
{
  static int Work(int n)
  {
    int s = 0;
    for (int i = 0; i < n; i++) s += i; // small CPU work
    return s;
  }

  public static void Main(string[] args)
  {
    // Warm up (JIT/caches)
    Work(10000);

    var sw = Stopwatch.StartNew();
    for (int r = 0; r < 10; r++)
    {
      Work(20000);
    }
    sw.Stop();

    Console.WriteLine("Elapsed ms (10 runs): " + sw.ElapsedMilliseconds);
  }
}

Вспомогательный класс для измерения времени

Оберните блоки в TimeScope, чтобы видеть длительность именованных участков и не повторять код секундомера.

using System;
using System.Diagnostics;

// A small scope that times a block and prints on dispose.
public sealed class TimeScope : IDisposable
{
  private readonly string _name;
  private readonly Stopwatch _sw;

  public TimeScope(string name)
  {
    _name = name;
    _sw = Stopwatch.StartNew();
  }

  public void Dispose()
  {
    _sw.Stop();
    Console.WriteLine(_name + " took " + _sw.ElapsedMilliseconds + " ms");
  }
}

public class Program
{
  static void DoWork()
  {
    // pretend work
    long s = 0;
    for (int i = 0; i < 300000; i++) s += i;
    if (s == -1) Console.WriteLine();
  }

  public static void Main(string[] args)
  {
    using (new TimeScope("DoWork"))
    {
      DoWork();
    }
  }
}

Демонстрация идентификатора корреляции

Установите идентификатор корреляции (ActivityId), чтобы связывать относящиеся друг к другу сообщения трассировки в разных вызовах.

using System;
using System.Diagnostics;

// Use a correlation ID so related trace lines can be grouped.
public class Program
{
  public static void Main(string[] args)
  {
    Trace.Listeners.Clear();
    Trace.Listeners.Add(new ConsoleTraceListener());

    Guid id = Guid.NewGuid();
    Trace.CorrelationManager.ActivityId = id;

    Trace.TraceInformation("Start request");
    // ... do work
    Trace.TraceInformation("Processing step A");
    Trace.TraceInformation("Processing step B");
    Trace.TraceInformation("End request");

    Console.WriteLine("ActivityId: " + id);
  }
}

Обзор профилирования

  • Профилировщики сэмплирования: периодически сохраняют снимки стека (низкие накладные расходы)
  • Инструментирование: измеряет конкретные блоки (секундомер и области измерения времени)
  • Начинайте с общего профилирования сэмплированием, а затем подтверждайте результаты целевыми измерениями времени

Правила аккуратных измерений

Советы:

  • Измеряйте в режиме выпуска с включёнными оптимизациями
  • Не вызывайте Console.WriteLine внутри измеряемого кода
  • Повторяйте запуски; сообщайте средние значения
  • Измеряйте реалистичные размеры входных данных

Правило микротестирования производительности

Быстрая проверка: какой базовый приём рекомендуется при микротестировании кода с помощью секундомера?

Повторение

Повторение: используйте секундомер и небольшие области измерения времени для измерения блоков; добавляйте идентификатор корреляции для связывания трассировок; проводите измерения корректно (прогрев, повторы, режим выпуска).

Часто задаваемые вопросы

Урок «Основы профилирования и трассировки (концепции)» бесплатный?

Да — полный текст урока «Основы профилирования и трассировки (концепции)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.

Чему я научусь в уроке «Основы профилирования и трассировки (концепции)»?

Измеряйте код с помощью Stopwatch, создавайте небольшие области измерения времени, разберитесь в идентификаторах корреляции трассировки и изучите основы аккуратного микротестирования производительнос… Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.

Сколько времени занимает урок «Основы профилирования и трассировки (концепции)»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Абстракции журналирования, Debug/Trace
  2. Основы профилирования и трассировки (концепции)
  3. Шаблоны защитных проверок и валидации
← Назад к C# Academy