Parallel.Foreach не намного быстрее, чем foreach - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть коллекция IEnumerable, как показано ниже.это коллекция коллекции.Основная коллекция состоит из 10 предметов, а каждый предмет имеет 100 тыс. Предметов.

Мой ЦП имеет 6 ядер, 24 ГБ ОЗУ, 1,5 ТБ жесткого диска.3. Пользователь использует удаленный рабочий стол.

 IEnumerable<AFValues> afValues = listAvgResults.Select(pointResults => pointResults[type]);

, когда я использую Parallel.ForEach, это заняло 9,8, а foreach - 10 секунд.

MTObservableCollection<VesselData> vesselList = new MTObservableCollection<VesselData>();

Parallel.ForEach(afValues, pointValues =>
                        {
 vesselList.Add(row);
});

Спасибо

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Вся работа происходит в Add(), и при условии, что MTObservableCollection использует некоторую блокировку в этом методе, все потоки ждут друг друга, чтобы добавить что-то в список.

Это не похоже на работу, которую можно ускорить распараллеливанием.

0 голосов
/ 14 декабря 2018

Если вы используете MSSQL, альтернативой может быть вставка BULK.

В прошлом я делал это двумя способами:

  1. SqlBulkCopy

  2. Хранимая процедура с Табличными параметрами (и отправка данных в виде DataTable из C #)

Таким образом, это будет меньше секунды, я думаю.

0 голосов
/ 14 декабря 2018

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

Если вы хотите получить точные результаты, используйте некоторые из профилировщиков.

...