mirror of
https://github.com/pavel-odintsov/fastnetmon
synced 2024-11-23 09:12:14 +01:00
27 lines
2.2 KiB
Markdown
27 lines
2.2 KiB
Markdown
История использования структур была такой:
|
||
* 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 для записи.
|