Я работаю над приложением, которое выполняет обработку с тем, что я бы назвал довольно высокой пропускной способностью (текущие пики в диапазоне 400 Мбит / с, цель проекта - 10 Гбит / с).
Я запускаю несколько экземпляров цикла, который в основном просто циклически просматривает и обрабатывает информацию, и использует словарь для хранения состояния. Тем не менее, мне также нужно периодически сканировать весь словарь, чтобы проверить время ожидания, и я хотел бы получить некоторые идеи о том, что делать, если это сканирование становится горячей точкой производительности. По сути, я ищу, есть ли какие-либо стандартные методы чередования проверок времени ожидания в словаре с основным кодом обработки в цикле, так что, скажем, в цикле 1 я проверяю первый элемент словаря, цикл 2, второй, и т. д. Кроме того, ключи словаря изменяются и будут удалены и добавлены в основной код обработки, так что это не так просто, как взять копию всех ключей словаря и затем проверить их одну за другой в основном цикле .
Повторюсь, это не проблема с текущей производительностью. Поэтому, пожалуйста, не комментируйте преждевременную оптимизацию, я понимаю, что это преждевременно, я сознательно делаю выбор, чтобы считать это потенциальной проблемой.
Редактировать для ясности : Мне любопытно, что я думаю об этом на выходных, и какой подход передовой практики может быть для чего-то подобного. Это не единственная проблема, которую я имею, и не единственная область производительности, на которую я смотрю. Тем не менее, это одна из областей, где мне не совсем понятен четкий и краткий подход к этому.
Я уже использую в этом параллелизм и аппаратные средства (следующий уровень аппаратного обеспечения - это пятикратное увеличение стоимости, но, что более важно, потребует пересмотра параллелизма). Параллелизм также работает так, как я хочу, поэтому, пожалуйста, не нужно комментировать это. Словарь создается для каждого потока, поэтому любые дополнительные потоки для выполнения проверок потребуют синхронизации между потоками, что слишком дорого.
Какой-то псевдокод логики, если он помогает:
Dictionary hashdb;
while(true) {
grab_record_from_buffer(); // There is a buffer in place, so some delays are tolerable
process(record); //do the main processing
update_hashdb(); //Add,remove,update entries in the dictionary
if(last_scan > 15 seconds)
foreach(entry in hashdb)
periodic_check(entry); //check for timeouts or any other periodic checks on every db entry
}
Я понимаю, что не могу столкнуться с реальной проблемой из-за того, как она у меня есть, поэтому есть большая вероятность, что все, что придет, может не потребовать использования. Однако, что я действительно ищу, так это если есть какой-либо стандартный подход или алгоритм для чередования сканирования словаря с основной логикой обработки, о котором я просто не знаю (и словарь меняется). Или какие-нибудь предложения по подходу к этому (у меня уже есть идея, как бы я подошел к этому, но он не так чист, как хотелось бы).
Спасибо,