Я слышу, как все говорят о том, как многопоточность может улучшить производительность. Я не верю этому, если только я чего-то не упускаю. Если у меня есть массив из 100 элементов, и его обход занимает 6 секунд. Когда я делю работу между двумя потоками, процессору придется выполнять один и тот же объем работы и, следовательно, время, за исключением того, что они работают одновременно, но с половинной скоростью. Разве многопоточность не должна делать его еще медленнее? Так как вам нужны дополнительные инструкции по разделению работы?
Повышает ли многопоточность производительность? Как?
Ответы (2)
Для простой задачи повторения 100 элементов в многопоточности задача не принесет повышения производительности.
Итерируя более 100 миллиардов элементов и выполняя обработку каждого элемента, использование дополнительных процессоров вполне может помочь сократить время обработки. А более сложные задачи, скорее всего, вызовут прерывания, например, из-за ввода-вывода. Когда один поток спит, ожидая, пока периферийное устройство завершит ввод-вывод (например, запись на диск или нажатие клавиши с клавиатуры), другие потоки могут продолжить свою работу.
Для задач, связанных с ЦП, когда у вас более одного ядра в вашем процессоре, вы можете разделить свою работу на каждое ядро вашего процессора. Если у вас два ядра, разделите работу на два потока. Таким образом, потоки будут работать на полной скорости. Однако создание потоков очень дорогое, поэтому вам потребуется довольно большая рабочая нагрузка, чтобы преодолеть начальные затраты на создание потоков.
Вы также можете использовать потоки для повышения производительности (или отзывчивости) в интерактивном приложении. Вы запускаете тяжелые вычисления в фоновом потоке, чтобы избежать блокировки взаимодействия пользовательского интерфейса. Вычисления не выполняются быстрее, но у вашего приложения нет таких «зависаний», из-за которых оно кажется медленным и не отвечает.