2016-10-12 5 views
-1

Код, который я выполняю, имеет простую функцию. Он сравнивает первые 2 элемента кортежа (Tuple<int, int, BigInteger>) с другим и определяет, являются ли все записи разными. Если они есть, комбинированный Кортеж (Tuple<int, int, int, int BigInteger>) формируется и добавляют к List<Tuple<int, int, int, int, BigInteger>>Вложенные Parallel.For производительность петли и большие списки

Пример:

Tuple<int, int, BigInteger> example1 = new Tuple<int, int BigInteger>(5, 6, 1000); 
    Tuple<int, int, BigInteger> example2 = new Tuple<int, int BigInteger>(7, 9, 7979); 

С 5, 6, 7 и 9 все различны, они будут добавлены в окончательный список как < 5, 6, 7, 9, 1000 + 7979> (Item5 быть сумма ITEM3 в Tuple1 и Tuple2)

Вот мой код

for (int a = 0; a < rtSort.Count(); a++) { 
      Parallel.For<List<Tuple<int, int, int, int, BigInteger>>>(0, rtSort.Count - 1,() => new List<Tuple<int, int, int, int, BigInteger>>(), (b, loop, storage) => { 
       if (rtSort[a].Item1 != rtSort[b].Item1 && rtSort[a].Item1 != rtSort[b].Item2 && rtSort[a].Item2 != rtSort[b].Item2) 
        storage.Add(new Tuple<int, int, int, int, BigInteger>(rtSort[a].Item1, rtSort[a].Item2, rtSort[b].Item1, rtSort[b].Item2, rtSort[a].Item3 + rtSort[b].Item3)); 
       return storage; 
      }, 
      (x) => { 
       lock (rt2) { 
        rt2.AddRange(x); 
       } 
      }); 
    } 

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

rtSort.Count() обычно имеет значение 500500, а это означает, что в общей сложности, вложенная Parallel.For цикл и цикл For делает 500500 * 500500 итераций до отделки (250500250000).

Мой вопрос: Есть ли что я могу сделать, чтобы улучшить это и/или я делаю что-то неправильно, что может быть на самом деле препятствует производительности Петля Parallel.For в

Благодаря

+0

Каков тип rt2? –

+0

Список > – CocoaMix86

+0

Что произойдет, если 3 кортежа с первыми двумя значениями одинаковы? –

ответ

0

Замок может быть вопрос если AddRange принимает долго, если порядок не имеет значения в результате

Я бы бенчмарк текущее внедрение и с использованием ConcurrentBag

var result = new ConcurrentBag<Tuple<int, int, int, int, BigInteger>>(); 

    ... 

    (x) => { 
     foreach(var item in x) 
     { 
      result.Add(x); 
     }   
    }) 
+0

Как реализовать ConcurrentBag во всем цикле? – CocoaMix86

+0

ConcurrentBag - это структура данных, которая блокирует одно добавление одного элемента, в отличие от вашей реализации, которая блокируется до тех пор, пока не будут добавлены все элементы –