1
0
mirror of https://github.com/pavel-odintsov/fastnetmon synced 2024-11-23 05:02:10 +01:00
fastnetmon-rewritten/tests/DATA_STRUCTURES.md
2014-12-01 13:21:05 +04:00

2.2 KiB
Raw Blame History

История использования структур была такой:

  • std::map
  • Так как предыдущий тормозил, решено было взять: unordered_map С++ 11
  • Но std::unordered_map сегфолтился на пустом месте и был не особо стабилен: http://www.stableit.ru/2013/11/unorderedmap-c11-debian-wheezy.html
  • Мы вернулись на std::map
  • Но он тормозил и мы решили попробовать boost::unordered_map, он был быстр:

http://tinodidriksen.com/2009/07/09/cpp-map-speeds/

standard map: 41% cpu in top boost::unordered_map: 25% cpu in top

Но он постоянно сегфолтился и оказывается не был совершенно thread safe: http://boost.2283326.n4.nabble.com/boost-unordered-map-thread-safety-td2585435.html http://meetingcpp.com/tl_files/2013/talks/Containers%20in%20Boost%20-%20Boris%20Schaeling.pdf

Стоит обратить внимание, что сегфолтился он как раз в итераторе, который читал данные, но писал их лишь из под mutex

  • Мы по-прежнему на std::map

Что нам нужно?

Нам нужна структура, которая позволит с максимальной скоростью и минимальными потерями памяти сохранить значение по целочисленному беззнаковому 32 битному ключу. Особенность ключа в том, что он лежит в интервале от нуля о 2^32, но строго не последовательно, а непрерывными 50-100 блоками (разыне подсети).

При этом, структура должна обеспечивать возможность работы в многопоточном режиме в конфигурации - один пишет, а другой читает, по возможности с минимальным использованием блокировок.

Требования к скорости ~ 1^-6 для записи.