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

Профилирование и оптимизация

Профессиональный тест проверяет дисциплину оптимизации: сначала воспроизводимая нагрузка и профиль, затем гипотеза и проверка результата. Вопросы охватывают CPU samples, кэш, аллокации, векторизацию, benchmark traps и случаи, где асимптотически красивое решение проигрывает на реальных данных.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 30 вопросов, время — 85 минут. Во многих заданиях недостаточно узнать конструкцию: проследите порядок вычислений, время жизни объектов, владение ресурсами и условия, при которых решение остаётся корректным. После завершения откроются правильные ответы, объяснения, общий результат и тематические шкалы.
Вопрос 1 из 30
Что показывает sampling profiler?
C++C++20
void handle_request(const Request& request) {
    parse(request);
    authorize(request);
    load_data(request);
    render_response(request);
}
// sampling profiler периодически снимает стек активного потока
Вопрос 2 из 30
Чем inclusive time отличается от exclusive time?
C++C++20
void outer() {
    prepare();
    inner();
    finalize();
}
// inclusive outer включает inner, exclusive — только собственные участки outer
Вопрос 3 из 30
Что означает широкая башня на flame graph?
C++C++20
main
└─ serve_requests ███████████████████
   ├─ parse       ███
   └─ database    ██████████████
// ширина соответствует доле samples
Вопрос 4 из 30
Почему 90% wall time и 5% CPU time могут указывать не на вычислительное узкое место?
C++C++20
auto started = std::chrono::steady_clock::now();
auto data = socket.read(); // поток большую часть времени заблокирован
auto elapsed = std::chrono::steady_clock::now() - started;
Вопрос 5 из 30
Какой первый шаг разумен при жалобе “сервис медленный”?
C++C++20
BenchmarkScenario scenario{
    .dataset = production_like_data(),
    .concurrency = 64,
    .duration = 60s
};
auto report = profile(service, scenario);
Вопрос 6 из 30
Почему последовательный обход vector обычно кэш-дружелюбнее обхода list?
C++C++20
std::vector<Node> contiguous = load_nodes();
for (const Node& node : contiguous)
    sum += node.value;

std::list<Node> linked = load_list();
for (const Node& node : linked)
    sum += node.value;
Вопрос 7 из 30
Когда Structure of Arrays может быть быстрее Array of Structures?
C++C++20
struct Particle { float x, y, z, mass, temperature; };
std::vector<Particle> aos;

struct Particles {
    std::vector<float> x, y, z;
    std::vector<float> mass;
    std::vector<float> temperature;
} soa;
// горячий цикл использует только x, y и z
Вопрос 8 из 30
Что такое cache line?
C++C++20
struct Counters {
    std::atomic<std::uint64_t> produced;
    std::atomic<std::uint64_t> consumed;
};
// соседние поля могут попадать в одну cache line и конкурировать между ядрами
Вопрос 9 из 30
Почему непредсказуемая ветвь в горячем цикле может быть дорогой?
C++C++20
for (const Item& item : items) {
    if (item.kind == unpredictable_kind())
        slow_path(item);
    else
        fast_path(item);
}
Вопрос 10 из 30
Какой доступ имеет лучшую пространственную локальность?
C++C++20
for (std::size_t i = 0; i < matrix.size(); ++i)
    sum += matrix[i];
// последовательные адреса используют уже загруженные cache lines
Вопрос 11 из 30
Как reserve может ускорить построение vector?
C++C++20
std::vector<Event> events;
events.reserve(expected_count);
for (auto&& source : sources)
    events.push_back(make_event(source));
Вопрос 12 из 30
Почему `std::make_shared` часто уменьшает число аллокаций?
C++C++20
auto direct = std::shared_ptr<Node>(new Node(args...));
auto combined = std::make_shared<Node>(args...);

// В типичной реализации combined размещает объект и control block
// в одном выделенном блоке.
Вопрос 13 из 30
Что показывает allocation profiler?
C++C++20
std::vector<std::unique_ptr<Node>> build_tree(Input in) {
    std::vector<std::unique_ptr<Node>> nodes;
    for (auto token : in)
        nodes.push_back(std::make_unique<Node>(token));
    return nodes;
}
// allocation profiler покажет число, размер и места выделений
Вопрос 14 из 30
Когда arena может дать выигрыш?
C++C++20
std::pmr::monotonic_buffer_resource arena(buffer, sizeof buffer);
std::pmr::vector<AstNode> nodes{&arena};
parse_into(nodes);
// все выделения освобождаются вместе с arena
Вопрос 15 из 30
Почему замена значения на `shared_ptr<T>` может ухудшить производительность?
C++C++20
struct ParticleValue {
    Position position;
    Velocity velocity;
};

struct ParticleShared {
    std::shared_ptr<State> state;
};

std::vector<ParticleValue> dense;
std::vector<ParticleShared> indirect;
Вопрос 16 из 30
Почему компилятор может удалить весь benchmark-цикл?
C++C++20
static void benchmark(benchmark::State& state) {
    for (auto _ : state) {
        int sum = 0;
        for (int x : values) sum += x;
        // sum нигде не наблюдается
    }
}
Вопрос 17 из 30
Зачем прогревать benchmark?
C++C++20
for (int i = 0; i < warmup_iterations; ++i)
    run_once(dataset);

for (int i = 0; i < measured_iterations; ++i)
    samples.push_back(measure(dataset));
Вопрос 18 из 30
Почему один замер недостаточен?
C++C++20
std::vector<double> samples;
for (int i = 0; i < 100; ++i)
    samples.push_back(measure(operation));
report(median(samples), percentile(samples, 0.95));
Вопрос 19 из 30
Как сравнивать две реализации честно?
Вопрос 20 из 30
Почему микробенчмарк может не предсказать выигрыш в приложении?
Вопрос 21 из 30
Что могут показать hardware performance counters?
Вопрос 22 из 30
Зачем смотреть disassembly горячего цикла?
Вопрос 23 из 30
Почему санитайзеры нужно запускать отдельно от benchmark?
Вопрос 24 из 30
Как защититься от регрессии скорости?
Вопрос 25 из 30
Как проверить, что branchless-переписывание сохранило смысл?
Вопрос 26 из 30
Когда передача по значению может быть хорошим API для sink-функции?
Вопрос 27 из 30
Почему виртуальный вызов не обязательно является главным узким местом?
Вопрос 28 из 30
Как noexcept может косвенно улучшить производительность контейнеров?
Вопрос 29 из 30
Что такое data-oriented design в контексте C++?
Вопрос 30 из 30
Когда оптимизацию стоит отклонить?

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

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

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

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