1 puntos por GN⁺ 2024-07-09 | 1 comentarios | Compartir por WhatsApp

Patrones de diseño para aplicaciones de baja latencia en C++

  • Autores: Paul Bilokon, Burak Gunduz
  • Fecha de envío: 8 de septiembre de 2023
  • Tema: Optimización de código de baja latencia, con énfasis especial en sistemas de trading de alta frecuencia (HFT)

Contribuciones principales

  • Creación de un repositorio de programación de baja latencia: una guía práctica que incluye benchmarking estadístico riguroso
  • Optimización de una estrategia de arbitraje estadístico neutral al mercado: mejoras significativas en velocidad y rentabilidad
  • Implementación en C++ del patrón Disruptor: mejor rendimiento que los métodos tradicionales de encolado

Métricas de evaluación

  • Velocidad
  • Uso de caché
  • Significancia estadística, etc.

Tecnologías principales

  • Calentamiento de caché: reducción de la latencia mediante la inicialización de la caché
  • Constexpr: mejora del rendimiento mediante evaluación de constantes en tiempo de compilación

Dirección futura

  • Expansión del repositorio
  • Pruebas de los algoritmos de trading optimizados en entornos de trading en tiempo real
  • Integración del patrón Disruptor y los algoritmos de trading para un benchmarking integral del sistema

Lectores objetivo

  • Profesionales de la academia y la industria

Resumen de GN⁺

Este artículo aborda patrones de diseño para mejorar el rendimiento de aplicaciones de baja latencia, especialmente sistemas de trading de alta frecuencia. El repositorio de programación de baja latencia y la implementación del patrón Disruptor pueden servir como una guía útil para profesionales. Técnicas como el calentamiento de caché y Constexpr contribuyen en gran medida a reducir la latencia. Este artículo será muy útil para quienes estén interesados en la optimización del rendimiento.

1 comentarios

 
GN⁺ 2024-07-09
Opiniones de Hacker News
  • Es una introducción breve al tema

  • Los estudiantes de pregrado ya conocen los elementos básicos de optimización de rendimiento

    • Aprenden conceptos básicos como predicción de saltos, coherencia de caché y caché de instrucciones
  • Sorprende que no se haya tratado el false sharing, que es un factor de degradación del rendimiento

  • También sorprende que no se hayan tratado atributos de pista de optimización como [[likely]] y [[unlikely]]

  • No se abordan elementos avanzados de optimización de rendimiento

    • Como APIs de E/S específicas, primitivas de sincronización, mecanismos de IPC y funciones integradas del compilador
  • Lo que necesita un programador de baja latencia es estar alerta ante asignaciones y copias innecesarias

    • Hace falta el hábito de identificar factores de degradación del rendimiento mediante benchmarks
  • Al escribir un servidor de baja latencia, se dio cuenta de que las operaciones de vector IO son más lentas que copiar objetos pequeños a un búfer contiguo

    • Se enfatiza que no existe la copia gratis
  • Los resultados de prueba proporcionan estadístico t y valor p

    • El estadístico t muestra el resultado de la prueba de raíz unitaria de los residuos
    • El valor p proporciona la probabilidad de que la hipótesis nula de la prueba sea verdadera
  • Esta parte parece haber sido escrita usando un LLM

  • El ejemplo de analizar el precio de cierre una vez al día durante 5 años y calcular el spread con una latencia de 65 microsegundos resulta extraño

    • No calcula estadísticas en el bucle interno
    • 65 microsegundos es demasiado lento para el bucle interno
    • Parece un ejemplo para practicar técnicas de optimización
  • Comparte una implementación de bolsa de valores escrita en C++

    • Usa el patrón LMAX disruptor
    • Quiere reescribirla en Rust
    • En Rust, la gestión de memoria y las dependencias son más fáciles
  • Escribió una biblioteca de logging en C++

    • Es similar a LMAX disruptor
    • Se usa en la comunidad de HFT
    • Permite logging detallado sin degradación del rendimiento
    • Resuelve el problema de que sus colegas no registraban información importante por temor a afectar el rendimiento
  • La eficiencia del despacho en tiempo de compilación se debe a que la decisión de llamada de función se toma en la etapa de compilación

    • Si el compilador puede determinar estáticamente qué función se llamará, puede insertar directamente en línea el código de la función llamada
    • Elimina toda la sobrecarga de llamadas a función y permite optimizaciones adicionales
  • Comparte una presentación de CppCon 2017

    • El tema es cuando los microsegundos se sienten como una eternidad
    • Si eres desarrollador profesional, conviene ver el material completo
  • Plantea la duda de si debería existir el trading de alta frecuencia

    • La gente se queja de que Bitcoin desperdicia energía, pero el trading de alta frecuencia tiene un impacto social puramente negativo