#c# #performance #task #task-parallel-library
#c# #Производительность #задача #задача-параллельная-библиотека
Вопрос:
Учитывая простую программу, что было бы лучше с точки зрения производительности / пропускной способности и почему это было бы лучше с точки зрения производительности? (Меня не волнует потребление памяти или загрузка процессора)
Предполагая, что для обработки данного сообщения требуется примерно 5 мс, и каждую секунду поступает ~ 500 сообщений. Что должно повысить производительность?
- 50 длительных задач, каждая из которых получает и обрабатывает ~ 10 сообщений в секунду
- Для создания и запуска новой задачи для каждого полученного сообщения
Мне интересно, как работать на обычном ПК с 8 ядрами, а не на суперкомпьютере с более чем 100 ядрами.
Просто для пояснения; В сценарии с 50 длительными задачами большинство задач большую часть времени будут ожидать сообщения, и после получения им будет подан сигнал о пробуждении, в то время как в сценарии создания новых задач каждую секунду будет создаваться ~ 500 задач.
Комментарии:
1. Когда вы измерили оба варианта на вашем конкретном целевом оборудовании и операционной среде, какой из них был быстрее? Это ваш ответ.
2. » 2. Для создания и запуска новой задачи для каждого полученного сообщения «: Не могли бы вы добавить больше информации о механизме, который получает сообщения и назначает их задачам?
3. Лично я предпочитаю запускать новую задачу для каждого сообщения. В прошлом у меня были случаи, и это было быстрее (но, вероятно, это ни для чего не правило), но также легче восстановить в случае сбоя. Если одна задача завершается неудачей, нам просто нужно повторно запустить сообщение. Если сообщение в пакете завершилось ошибкой, запустить весь пакет сложнее.
4. Невозможно ответить на этот вопрос с (отсутствием) предоставленной информации. Что делает приложение? Как вы можете заботиться, но в то же время не заботиться о производительности?
from a performance point of view? (I don't care about memory consumption or CPU usage)
но это и означает производительность — используйте заданные ядра ОЗУ и ЦП для более эффективной обработки сообщений. Если процессор заблокирован, программа будет работать медленно. Если процессор занят выделением оперативной памяти и сбором мусора, он не обрабатывает сообщения5. Кроме того, что означает обработка сообщения? Если вам нужно выполнить ввод-вывод, вам нужны задачи. Если вы ожидаете, вы используете задачи. Задачи не являются потоками, поэтому их большое количество не означает, что у вас будет много потоков. Наличие 1000 задач, связанных с вводом-выводом, не означает, что ваш процессор будет блокироваться. Вызов удаленного сервера, который не может обрабатывать более 5 одновременных вызовов, так или иначе заблокирует вас
Ответ №1:
Это невозможно предсказать. Во многом зависит от того, как вы обрабатываете сообщения, как задействуется кэш процессора, насколько интенсивна обработка сообщений с использованием процессора, какова активность ввода-вывода. Единственный надежный подход — сравнить ваш код и посмотреть, что работает лучше. Имейте в виду, что на результаты могут сильно влиять другие процессы, выполняемые на этом компьютере. Постарайтесь максимально эмулировать свою производственную среду.