Estos son algunos puntos al construir software para HFT
Después de varios años desarrollando sistemas comerciales de alto rendimiento, se me ocurren algunas reglas generales. Cuando me refiero al comercio de baja latencia / alta frecuencia, me refiero al software que debe tomar una decisión de compra o venta dentro de 5us (microsegundos).
Para lograr estas cosas, he aprendido que necesito olvidar todo sobre la ingeniería de software moderna. Debe cambiar de opinión por completo y olvidar todo lo aprendido en este campo: la latencia es el rey, no importa cuán feo sea su código .
- ¿Qué es un objeto de matriz de vértices en OpenGL?
- ¿Cuáles son las aplicaciones prácticas e industriales de los algoritmos de búsqueda / recorrido de gráficos BFS y DFS?
- ¿Es así como se elimina de un árbol de búsqueda binario cuando un padre tiene dos subárboles?
- ¿Qué algoritmo de búsqueda usa True caller?
- ¿Qué es mejor, resolver menos problemas por su cuenta o más problemas usando sugerencias?
Como resultado, resumiré todos los obstáculos que he encontrado al desarrollar este tipo de sistemas.
Lenguaje de programación : No, no existe un lenguaje perfecto para este tipo de operaciones, pero elíjalo con cuidado. ¡No solo tienes que entender cómo usarlo, sino dominarlo! Comprenda lo que hace en cada instrucción, cómo se administra la memoria cada vez que llama a un objeto, etc. SI está usando C # o Java, debe dominar el recolector de basura, esto podría ser mortal. Mi elección siempre fue C / C ++.
Elija sus tipos : dígame qué tipos está utilizando y le diré qué tan lento puede ser. Evite cadenas, fechas, bigDecimal, autoboxing, estructuras de datos complejas (por ejemplo, ArrayList crece, se apila, Maps rehash).
Evite la entrega de excepciones : ¡SÍ, evítelo! Es caro. El manejo de excepciones agrega al menos un 10-20% de tiempo de ejecución. Los compiladores necesitan agregar código adicional, cuidar la administración de la pila adicional para manejar las excepciones. Eso costó tiempo. Y antes de que alguien me diga que GCC usa el modelo de costo cero, yo diría, ¡perfile su sistema y mídalo! Recuerde, cada microsegundo cuenta.
Subprocesos: bloque de subprocesos / cambio de contexto, el planificador intervendrá, es difícil razonar sobre el rendimiento cuando hay muchos subprocesos. Comprenda cómo se comportan en su sistema operativo. Comprenda cómo funciona su arquitectura de hardware con subprocesos … Lo sé, es aburrido, pero esencial. No es necesario diseñar sistemas de hilos sofisticados (p. Ej., Amortiguadores de anillo, etc.). En la mayoría de los casos, cuanto más simple, mejor. Mi mejor enfoque: subprocesos anclados a un núcleo: use el giro ocupado para que el núcleo siempre esté mirando la cola .
Cachés : caché L1 a 5ns hasta disco a 10ms. La memoria principal es de 100 ns. Para ser lo suficientemente rápido, uno debe considerar dónde se almacenan los datos. Asegúrese de que sus algoritmos y estructura de datos aprovechen los cachés L1 tanto como sea posible.
Capas de abstracción : Olvídese de encapsular, hacer que su código sea agradable, limpio y reutilizable … Cuando los datos se pasan de una capa a otra, los datos se copian. ¡El programador elimina la prioridad de nuestro proceso para dar a otros procesos su “parte justa”, lo que significa que se pierden toneladas de ciclos de CPU!
Calentamiento de los datos : asegúrese de asignar previamente todas sus estructuras de datos antes de que se inicie el sistema principal. También tenga en cuenta los objetos reutilizables, para que no tenga que asignarlos más tarde. Recuerde, la asignación es costosa.
Ariel Silahian
http://www.sisSoftwareFactory.com/quant
https://twitter.com/sisSoftware