С какой точностью обычно работает логирование временных меток в C++?

«С какой точностью обычно работает логирование временных меток в C++?» — вопрос из категории Архитектура, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Точность временных меток в логах зависит от используемых API и требований системы. В современном C++ для этого чаще всего применяют <chrono>.

Типичные уровни точности:

  1. Секунды/Миллисекунды: Достаточно для логирования событий приложения (запросы пользователя, этапы работы). Достигается с помощью std::chrono::system_clock.
  2. Микросекунды/Наносекунды: Требуется для профилирования, high-frequency trading (HFT) или embedded-систем. Используется std::chrono::high_resolution_clock или платформо-специфичные вызовы.

Практический пример с <chrono>:

#include <iostream>
#include <chrono>
#include <iomanip>
#include <sstream>

std::string get_current_timestamp() {
    // Получаем текущее время с точностью до микросекунд
    auto now = std::chrono::system_clock::now();
    auto now_time_t = std::chrono::system_clock::to_time_t(now);
    auto now_ms = std::chrono::duration_cast<std::chrono::microseconds>(
                    now.time_since_epoch()) % 1000000;

    std::stringstream ss;
    ss << std::put_time(std::localtime(&now_time_t), "%Y-%m-%d %H:%M:%S.")
       << std::setfill('0') << std::setw(6) << now_ms.count();
    return ss.str();
}

int main() {
    std::cout << "[" << get_current_timestamp() << "] Application started.n";
    // ... выполнение работы
    std::cout << "[" << get_current_timestamp() << "] Task completed.n";
    return 0;
}
// Пример вывода: [2023-10-26 14:30:15.123456] Application started.

Важные замечания:

  • std::chrono::high_resolution_clock может быть псевдонимом для system_clock или steady_clock, его реальное разрешение зависит от реализации компилятора и ОС.
  • Для максимальной точности и минимальных накладных расходов в performance-critical коде иногда приходится использовать платформо-специфичные API, такие как clock_gettime(CLOCK_MONOTONIC, ...) на Linux или QueryPerformanceCounter на Windows, и затем интегрировать их в C++-код.