VB.NET: запуск большого количества потоков занимает много времени? - PullRequest
0 голосов
/ 14 февраля 2011

Я пытаюсь написать многопоточное приложение.

Рассмотрим следующий код:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim sw As New Stopwatch
    Dim sw2 As New Stopwatch

    sw.Start()

    For x As Integer = 0 To 150
        Dim th As Thread = New Thread(New ThreadStart(AddressOf work))
        th.Start()

    Next

    sw.Stop()


    MsgBox(sw.Elapsed.ToString())

End Sub

Private Sub work()
End Sub

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

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

Почему так долго запускаются темы? Как только вы извлекаете строку th.start (), код выполняется за полсекунды.

Есть ли более быстрый способ запуска потоков? Должен ли я использовать систему потоков пула вместо? Похоже, что многопоточность бессмысленна, когда она может на самом деле приводить к гораздо более медленным скоростям, чем однопоточность ..., учитывая, что простая загрузка всех потоков может занять так много времени.

1 Ответ

1 голос
/ 14 февраля 2011

Запуск 150 потоков - почти всегда плохая идея. Планировщик возненавидит вас и сделает вашу жизнь несчастной из-за созерцания такого безумия.

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

Выполнение задач через один из стандартных пулов потоков - довольно хороший компромисс.

...