на C# Net 2.0Многопоточный заполняющий массив
Код работает немного медленнее, чем однопоточная версия. xDiff = 2100, yDiff = 2000; Почти 14 секунд в однопоточной, 16 сек в многопоточном (этот код). Что-то должно быть неправильно. Мне нужно заполнить массив результатов. Только один раз записывает данные на узле массива, не читает, поэтому он должен быть подходящим для многопоточности.
double[,] result = new double[xDiff, yDiff];
int threadCount = Environment.ProcessorCount;
ManualResetEvent finished = new ManualResetEvent(false);
int perthread = xDiff/threadCount;
int left = xDiff % threadCount;
int toProcess = threadCount;
int s = 0;
int e = left;
for (int ii = 0; ii < threadCount; ii++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object state)
{
for (int x = s; x < e; x++)
for (int y = 0; y < yDiff; y++)
{
result[x, y] = DoWork((xStart + x), (yStart + y), p)
}
if (System.Threading.Interlocked.Decrement(ref toProcess) == 0) finished.Set();
}), null);
s = e;
e += perthread;
}
finished.WaitOne();
return result;
xStart, yStart double и p - большой класс. Функция DoWork Только вызывает некоторые функции p, но не записывает/не изменяет данные в классе.
Кратко результат [x, y] = DoWork ((xStart + x), (yStart + y), p); Мне нужно заполнить массив так быстро, как я могу. Как мне это сделать?
ли DoWork делать какую-то операцию блокировки? Если это так, вы лучше ставите в очередь новый рабочий элемент за звонок DoWork. Обратите внимание, что QueueUserWorkItem фактически не создает новые потоки –
Рассмотрите возможность использования одной из готовых циклов в классе Parallel. Ваше дело не выглядит особенным. – usr
@usr Я забыл, что сначала, но OP использует .NET 2.0. – CodesInChaos