2017-06-08 41 views
6

ASIO, HFT (Yüksek Frekans Ticareti) gibi düşük gecikme gerektiren uygulamalar oluşturmak için kullanılabilir mi?ASIO, düşük gecikmeli uygulamalar oluşturmak için kullanılabilir mi?

  • Yani Boost.ASIO platforma özel optimum demultiplexing mekanizmasını kullanır: IOCP, epoll, kqueue, poll_set,/dev/

  • TOE özelliğine sahip

    Ayrıca kullanılabilir Ethernet-Adaptör (TCP/IP boşaltması anket motor) ve OpenOnload (çekirdek-baypas BSD soketleri).

Ancak düşük gecikmeli uygulama Boost.ASIO + TOE + OpenOnload kullanılarak oluşturulabilir mi?

cevap

9

Birkaç yıl önce yüksek frekanslı ticarette kullanılmak üzere Boost Asio'yu değerlendirdim. Bilgimin en iyisine, temeller bugün hala aynı. Kullanmamaya karar vermemin bazı nedenleri:

  1. Asio, bind() stili geri aramalara dayanır. Burada bazı yük var.
  2. Belirli bir düşük seviyeli işlemlerin doğru zamanda veya doğru şekilde nasıl gerçekleştirileceği açık değildir.
  3. Bir alanda optimize etmek için önemli olan çok fazla karmaşık kod var. Belirli kullanım durumları için karmaşık, genel kodu optimize etmek daha zordur. Kapakların altına bakmanıza gerek olmayacağını düşünmek bir hata olur.
  4. HFT uygulamalarında taşınabilirliğe gerek yok çok az. Özellikle, bir çoklama mekanizmasının "otomatik" seçimine sahip olmak misyona aykırıdır, çünkü her mekanizmanın ayrı ayrı test edilmesi ve optimize edilmesi gerekir - bu, onu azaltmaktan ziyade daha çok iş yaratır.
  5. Bir üçüncü taraf kitaplığı kullanılacaksa, libev, libevent ve libuv gibi öğeler daha fazla savaşla sertleştirilir ve bu olumsuzluklardan bazılarını önler.

İlgili: C++ Socket Server - Unable to saturate CPU

+0

Ben puanlar görebilirsiniz. 5. ve (biraz) 4. About 2. Özel işleyici türleri ile birlikte iplikçikleri doğru şekilde işleme geldiğinde katılıyorum. "Doğru şekilde" ile demek istediğin şey bu mu? Async tamamlamalarıyla asgari yükün önlenebileceği bir yerde, stil geri çağrılarının nasıl yapıldığını (1) gerçekten anlamıyorum. (3.) Kütüphane kodunu mı yoksa çağrı kodunu mı kullanıyorsunuz? Belki de çekici bir örnek var mı? – sehe

+0

@sehe: Boost.Asio kullanarak örnek kodum yok - işe yaramayacağını fark ettiğimizde onunla oluşturduğumuz prototipleri attık. O zamanlar libuv, yaşayabilir değildi, fakat “libev” ve “libevent” - hala kendi yolumuza gitmeyi seçtik. "Doğru şekilde" ile kastettiğim şeylerden bazıları (a) belirli zamanlarda belirli yiyecekleri/ioctlleri kullanmak, (b) çoklu bağlantıların önceliklendirilmesi üzerinde tam kontrol sahibi olmak (c) ve (c) kullanımı 'accept4() '(bugün bile Asio'nun kullanamadığı, dolayısıyla atomik' SOCK_CLOEXEC 'yapamaz) gibi spesifik, satılamaz API'ler. –

+0

Ah. “Doğru yolla” demek, dış gereksinimlerle ilgili olarak (“Asio için” demek istediğini varsaymıştım). Atomic SOCK_CLOEXEC, koştum ve çalışmak zorunda kaldım. Herhangi bir örnek beklemiyorum _code_, sadece soyut mermi metinleri ile aklınızda bulundurduğunuz _scenarios_ açıklayan bu gibi örnekler :) – sehe

İlgili konular