Скорость снижения при многопоточности?

#multithreading #performance

#многопоточность #Производительность

Вопрос:

Я редактирую многопоточное приложение, поэтому мне нужно изучить его и задать теоретический вопрос.

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

Я думал о том, что в однопоточном приложении тратится не так уж много времени на обработку, поэтому, если у вас много потоков, каждому из них придется ждать своей очереди на обработку, что в совокупности приведет к замедлению работы программы.

Я что-то неправильно понял?

Если нет, то какое рекомендуемое экономичное количество потоков.

Комментарии:

1. Зависит от вашей конкретной задачи. Потоки останавливаются и запускаются в середине функции, поэтому их использование может привести к большим затратам на синхронизацию. Кроме того, существуют другие способы параллельной обработки (например, обрабатывать текстовые файлы размером 10 Тыс.), например, сопрограммы, см. en.wikipedia.org/wiki/Coroutine

2. В Википедии уже много ссылок, важная из них — закон Амдала. И нет, 70 потоков не делают движок dbase быстрее.

Ответ №1:

Взгляните сюда :

Wiki — ваш друг…

—— Отредактировано ——

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

Раньше в моих многопоточных приложениях я создавал свой собственный пул потоков, фактически 2-5 по ядру. Теперь я использую пул, управляемый системным API, и его может быть до 30.

Мой совет, создайте задачи, которые вы хотите запускать параллельно, поверх асинхронного API и потратьте некоторое время на построение графика вызовов. Так что каждая задача может быть передана любому потоку. Поступая таким образом, позвольте системе предоставить вам следующий доступный поток.

Еще один совет: сократите в своем потоке количество раз, когда вы вызываете API, попадающие в ядро.

В вашем случае вы должны найти узкое место, диск, сеть.

Комментарии:

1. Я прочитал это, и это не отвечает на мой вопрос, на самом деле это была статья, похожая на эту, которая породила вопрос.

Ответ №2:

Это не вопрос потерь. И несколько потоков не всегда являются правильным решением.

Если у вас есть однопоточный код, который спроектирован так, чтобы быть последовательным (для каждой строки кода требуется обработка предыдущей строки кода), тогда нет смысла разделять его на разные потоки.

Многопоточность хороша только тогда, когда вы можете открывать потоки и не замораживать один другой с помощью объединений (когда вам не нужно ждать завершения других потоков).

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

Итак, примерно сколько? Это зависит от того, что вы делаете.

Если вы просто выполняете асинхронный метод, где вы просто хотите, чтобы он выполнялся и возвращал значение по завершении, тогда количество потоков не ограничено. Вы можете использовать столько потоков, сколько сочтете нужным по логике (хотя для слишком большого количества потоков требуются накладные расходы)

Если вы хотите разбить вычисление на части и отправить разные фрагменты на разные процессоры, нет причин открывать больше потоков, чем количество процессоров. (хотя я считаю, что в некоторых случаях, если вы используете примерно в 1,5 раза больше процессоров, вы можете получить лучшие результаты)

Комментарии:

1. У меня около 60-70 потоков, собирающих данные из разных мест и перемещающих их в центральную базу данных. задачи независимы друг от друга, но это всего лишь двухъядерная машина. не нужно подчеркивать мой код, я пытаюсь понять, почему он медленный.

2. если он собирается в единую базу данных, в этой базе данных должна быть какая-то блокировка. Если блокировка установлена на высоком уровне, то она будет блокировать базу данных слишком долго.

3. Вам следует подумать о проверке, можете ли вы использовать там блокировку чтения-записи или сохранять буферизованные данные

Ответ №3:

На самом деле я думаю, что вас больше интересует теория параллельных вычислений, а не столько многопоточность: смотрите здесь.

Короткий ответ заключается в том, что это во многом зависит от того, насколько распараллеливаема работа на самом деле, сколько процессоров работает над ней и сколько зависимостей данных существует между распараллеленными частями.