C# C#  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Профилирование C# и .NET

Проверяет практическое профилирование .NET: процессор, аллокации, блокировки, трассировки и нагрузочные испытания. Вопросы учат отличать симптом от причины, выбирать временное окно и подтверждать улучшение измерением, а не одиночным Stopwatch.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В заданиях с кодом учитывайте указанную конструкцию и не додумывайте отсутствующие условия. После завершения откроются общий результат, тематические шкалы и разбор каждого ответа.
Вопрос 1 из 30
Чем профиль dotnet-sampled-thread-time полезен при поиске горячих участков?
BashКоманда dotnet-trace
dotnet-trace collect --process-id 1234 \
  --profile dotnet-sampled-thread-time,dotnet-common \
  --duration 00:00:00:30 \
  --output cpu-hotspots.nettrace
Вопрос 2 из 30
Что означает высокий inclusive time метода?
Вопрос 3 из 30
Почему первый вызов метода нельзя сравнивать с прогретыми?
C#
var stopwatch = Stopwatch.StartNew();
Compute(data);
Console.WriteLine(stopwatch.Elapsed);
Вопрос 4 из 30
Что проверить при 100% CPU и низком throughput?
Вопрос 5 из 30
Как отличить дорогой алгоритм от частого дешёвого вызова?
C#
// Сопоставьте:
// ParseHeader: 2 µs × 10 000 000 вызовов
// RebuildIndex: 200 ms × 2 вызова
Вопрос 6 из 30
Что показывает allocation profile?
BashКоманда dotnet-trace
dotnet-trace collect --process-id 1234   --providers Microsoft-Windows-DotNETRuntime:0x1C000080018:5
Вопрос 7 из 30
Где возникает boxing?
C#
int value = 42;
object boxed = value; // boxing
int copy = (int)boxed;
Вопрос 8 из 30
Почему интерполяция в отключённом log level может всё равно выделять?
Вопрос 9 из 30
Как closure проявляется в allocations?
C#
var threshold = GetThreshold();
var selected = items.Where(x => x.Score > threshold); // захват threshold
Вопрос 10 из 30
Что важнее при подозрении на утечку?
Вопрос 11 из 30
Что такое lock contention?
C#
lock (_gate)
{
    UpdateSharedState();
    SlowOperation();
}
Вопрос 12 из 30
Какой паттерн вызывает ThreadPool starvation?
C#
public string Handle() => client.GetStringAsync(uri).Result;
Вопрос 13 из 30
Что покажет contention trace?
Вопрос 14 из 30
Почему lock вокруг HTTP-вызова особенно плох?
C#
lock (_gate)
{
    return client.GetAsync(uri).GetAwaiter().GetResult();
}
Вопрос 15 из 30
Как увидеть spin вместо блокировки?
Вопрос 16 из 30
Чем trace отличается от агрегированной метрики?
C#
using var activity = source.StartActivity("checkout");
metrics.Requests.Add(1);
await ProcessAsync(token);
Вопрос 17 из 30
Зачем метка времени деплоя на графике?
Вопрос 18 из 30
Почему async stack в профиле может выглядеть разорванным?
C#
using var activity = source.StartActivity("order.process");
await repository.LoadAsync(id, token);
await payment.ChargeAsync(id, token);
Вопрос 19 из 30
Как связать длинную паузу запроса с GC?
Вопрос 20 из 30
Какие данные, кроме самой трассы, нужно сохранить, чтобы результат можно было сравнить и правильно истолковать?
BashСбор трассы с контекстом
utc=20260714T100200Z
pid=1234
version=2026.07.14.3
scenario=checkout-500-rps
profile=dotnet-sampled-thread-time,dotnet-common

dotnet-trace collect \
  --process-id "$pid" \
  --profile "$profile" \
  --duration 00:00:00:30 \
  --output "checkout-$utc.nettrace"
Вопрос 21 из 30
Почему BenchmarkDotNet лучше ручного Stopwatch для микротеста?
C#
[MemoryDiagnoser]
public class Benchmarks
{
    [Benchmark] public int Parse() => Parser.Parse(input);
}
Вопрос 22 из 30
Что означает baseline в benchmark?
C#
[Benchmark(Baseline = true)] public int Old() => OldAlgorithm(data);
[Benchmark] public int New() => NewAlgorithm(data);
Вопрос 23 из 30
Какой порог производительности ставить в CI?
Вопрос 24 из 30
Что добавить в нагрузочный тест сервиса?
Вопрос 25 из 30
Как сделать профиль воспроизводимым?
C#
loadgen run --scenario checkout --users 200 --duration 5m --seed 4242
Вопрос 26 из 30
Что такое performance budget?
C#
public static readonly TimeSpan CheckoutBudget =
    TimeSpan.FromMilliseconds(500);
Вопрос 27 из 30
Почему очередь может расти при CPU < 100%?
Вопрос 28 из 30
Когда batching повышает throughput?
C#
while (await timer.WaitForNextTickAsync(token))
{
    var batch = queue.TakeUpTo(100);
    await storage.WriteBatchAsync(batch, token);
}
Вопрос 29 из 30
Как понять, кэшировать ли вычисление?
Вопрос 30 из 30
Когда масштабирование экземпляров не поможет?
C#
// 20 replicas не ускорят запрос, сериализованный одной DB advisory lock.
// Исправление — изменить критическую секцию/модель данных.

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу