Повышает ли многопоточность производительность? Как?

Я слышу, как все говорят о том, как многопоточность может улучшить производительность. Я не верю этому, если только я чего-то не упускаю. Если у меня есть массив из 100 элементов, и его обход занимает 6 секунд. Когда я делю работу между двумя потоками, процессору придется выполнять один и тот же объем работы и, следовательно, время, за исключением того, что они работают одновременно, но с половинной скоростью. Разве многопоточность не должна делать его еще медленнее? Так как вам нужны дополнительные инструкции по разделению работы?


person Valentin    schedule 08.03.2013    source источник
comment
Посмотрите на этот: stackoverflow.com/questions/2856239/   -  person Chris    schedule 08.03.2013
comment
Если у вас, например, 4 процессора (что довольно часто встречается в настоящее время даже в смартфонах), а ваша программа имеет только один поток, она будет иметь доступ только к 25% доступных ресурсов ЦП. Если у вас только один процессор, это не имеет значения.   -  person assylias    schedule 08.03.2013
comment
Значит, одна однопоточная программа не может использовать все ядра?   -  person Valentin    schedule 08.03.2013


Ответы (2)


Для простой задачи повторения 100 элементов в многопоточности задача не принесет повышения производительности.

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

person suspectus    schedule 08.03.2013
comment
+1 за упоминание производительности ввода-вывода - основной причины, по которой были созданы упреждающие мутазадачи. - person Martin James; 08.03.2013
comment
Многие настольные устройства не поддерживают многопоточное использование. Например, у лучших дисков есть два неблокирующих канала: для чтения и для записи. Это означает, что только один поток может эффективно писать одновременно. Аппаратное обеспечение сервера может иметь несколько каналов: один диск может иметь несколько подключений SATA или может использоваться в RAID. В этом случае более эффективно использовать несколько потоков. - person Pingwin Tux; 11.10.2014

Для задач, связанных с ЦП, когда у вас более одного ядра в вашем процессоре, вы можете разделить свою работу на каждое ядро ​​вашего процессора. Если у вас два ядра, разделите работу на два потока. Таким образом, потоки будут работать на полной скорости. Однако создание потоков очень дорогое, поэтому вам потребуется довольно большая рабочая нагрузка, чтобы преодолеть начальные затраты на создание потоков.

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

person Albin Sunnanbo    schedule 08.03.2013