Производительность C #: мало длительных задач против многих коротких задач

#c# #performance #task #task-parallel-library

#c# #Производительность #задача #задача-параллельная-библиотека

Вопрос:

Учитывая простую программу, что было бы лучше с точки зрения производительности / пропускной способности и почему это было бы лучше с точки зрения производительности? (Меня не волнует потребление памяти или загрузка процессора)

Предполагая, что для обработки данного сообщения требуется примерно 5 мс, и каждую секунду поступает ~ 500 сообщений. Что должно повысить производительность?

  1. 50 длительных задач, каждая из которых получает и обрабатывает ~ 10 сообщений в секунду
  2. Для создания и запуска новой задачи для каждого полученного сообщения

Мне интересно, как работать на обычном ПК с 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:

Это невозможно предсказать. Во многом зависит от того, как вы обрабатываете сообщения, как задействуется кэш процессора, насколько интенсивна обработка сообщений с использованием процессора, какова активность ввода-вывода. Единственный надежный подход — сравнить ваш код и посмотреть, что работает лучше. Имейте в виду, что на результаты могут сильно влиять другие процессы, выполняемые на этом компьютере. Постарайтесь максимально эмулировать свою производственную среду.