1 pontos por GN⁺ 2024-07-09 | 1 comentários | Compartilhar no WhatsApp

Padrões de design em C++ para aplicações de baixa latência

  • Autores: Paul Bilokon, Burak Gunduz
  • Data de submissão: 8 de setembro de 2023
  • Tema: otimização de código de baixa latência, com foco especial em sistemas de trading de alta frequência (HFT)

Principais contribuições

  • Criação de um repositório de programação de baixa latência: um guia prático, incluindo benchmarking estatístico rigoroso
  • Otimização de uma estratégia de arbitragem estatística neutra ao mercado: melhorias significativas em velocidade e lucratividade
  • Implementação em C++ do padrão Disruptor: melhor desempenho do que métodos tradicionais de enfileiramento

Métricas de avaliação

  • velocidade
  • uso de cache
  • significância estatística, entre outros

Principais técnicas

  • Aquecimento de cache: redução da latência por meio da inicialização do cache
  • Constexpr: melhora de desempenho com avaliação de constantes em tempo de compilação

Direções futuras

  • expansão do repositório
  • teste dos algoritmos de trading otimizados em ambientes de negociação em tempo real
  • integração do padrão Disruptor com algoritmos de trading para benchmarking abrangente do sistema

Público-alvo

  • profissionais da academia e da indústria

Resumo do GN⁺

Este artigo aborda padrões de design para melhorar o desempenho de aplicações de baixa latência, especialmente sistemas de trading de alta frequência. O repositório de programação de baixa latência e a implementação do padrão Disruptor podem servir como um guia útil para profissionais. Técnicas como aquecimento de cache e constexpr contribuem bastante para a redução da latência. Este artigo será muito útil para quem tem interesse em otimização de desempenho.

1 comentários

 
GN⁺ 2024-07-09
Comentários do Hacker News
  • É uma introdução simples ao tema

  • Estudantes de graduação já conhecem os elementos básicos de otimização de desempenho

    • Aprendem conceitos básicos como previsão de desvios, coerência de cache e cache de instruções
  • Surpreende que não tenha abordado false sharing, um fator de degradação de desempenho

  • Também surpreende que não tenha abordado atributos de dica de otimização ([[likely]], [[unlikely]])

  • Não cobre elementos avançados de otimização de desempenho

    • Como APIs de IO específicas, primitivas de sincronização, mecanismos de IPC e funções intrínsecas do compilador
  • O que um programador de baixa latência precisa é de cautela com alocações e cópias desnecessárias

    • É preciso criar o hábito de encontrar fatores de degradação de desempenho por meio de benchmarks
  • Ao escrever um servidor de baixa latência, percebeu-se que operações de vector IO são mais lentas do que copiar pequenos objetos para um buffer contíguo

    • Enfatiza que não existe cópia gratuita
  • Os resultados de teste fornecem estatística t e valor p

    • A estatística t representa o resultado do teste de raiz unitária dos resíduos
    • O valor p fornece a probabilidade de a hipótese nula do teste ser verdadeira
  • Essa parte parece ter sido escrita com uso de LLM

  • O exemplo de analisar o preço de fechamento uma vez por dia durante 5 anos e calcular o spread com latência de 65 microssegundos é estranho

    • Não calcula estatísticas no loop interno
    • 65 microssegundos é lento demais para o loop interno
    • Parece ser um exemplo para praticar técnicas de otimização
  • Compartilha uma implementação de bolsa de valores escrita em C++

    • Usa o padrão LMAX disruptor
    • Pretende reescrevê-la em Rust
    • Em Rust, gerenciamento de memória e dependências são mais fáceis
  • Escreveu uma biblioteca de logging em C++

    • Semelhante ao LMAX disruptor
    • É usada na comunidade de HFT
    • Permite logging detalhado sem degradação de desempenho
    • Resolve o problema de colegas não registrarem informações importantes por receio de perda de desempenho
  • A eficiência do dispatch em tempo de compilação vem do fato de a decisão da chamada de função ser feita na fase de compilação

    • Se o compilador puder determinar estaticamente qual função será chamada, poderá fazer inline direto do código da função chamada
    • Remove todo o overhead de chamada de função e permite otimizações adicionais
  • Compartilha materiais de uma palestra da CppCon 2017

    • O tema é quando microssegundos parecem uma eternidade
    • Se você é um desenvolvedor profissional, vale a pena ver o material completo
  • Questiona se há alguma razão para a existência de high-frequency trading

    • Reclama-se que o Bitcoin desperdiça energia, mas high-frequency trading tem um impacto social puramente negativo