У меня матрица 1000x1000, и я использую Emgu CV. Я пытаюсь найти индекс элемента в этой матрице.
Итак, сначала я пробую это в Matlab
test_matrix=rand(1000,1000);
tic
[row,col]=find(test_matrix==test_matrix(1,1));
toc;
Это завершается за 9,7 мс.
Затем я использую классический цикл for в C #.
for (int i = 0; i < element_matrix.Height; i++)
for (int j = 0; j < element_matrix.Width; j++)
if (element_matrix[i, j] == finding_element)
{
Find_Row_List.Add(i);
Find_Col_List.Add(j);
}
Это завершается за 460 мс.
Затем я делю матрицу на 10малую матрицу и рассчитать каждую деталь в разных потоках.
t1= new Thread(() => {
for(int i = 0; i < 100; i++)
{
for(int j=0;j<element_matrix.Width;j++)
{
if(element_matrix[i,j]==finding_element)
{
Find_Row_List.Add(i);
Find_Col_List.Add(j);
}
}
}
});
...
t1.Start();
t2.Start();
...
t10.Start();
t1.Join();
t2.Join();
...
t10.Join();
Это завершается за 310 мс.
Я повторяю этот процесс для 20 маленькой матрицы инити .
Завершается за 380 мс.
Затем я использую Parallel.For
Parallel.For(0, element_matrix.Height, i =>
{
for(int j = 0; j < element_matrix.Width; j++)
{
if(element_matrix[i,j]==finding_element)
{
Find_Row_List.Add(i);
Find_Col_List.Add(j);
}
}
});
Завершается за 224 мс.
Я использую два потока и Parallel.For
t1 = new Thread(() => {
Parallel.For(0, 500, i =>
{
for (int j = 0; j < element_matrix.Width; j++)
{
if (element_matrix[i, j] == finding_element)
{
Find_Row_List.Add(i);
Find_Col_List.Add(j);
}
}
});
});
t2 = new Thread(() => {
Parallel.For(500, 1000, i =>
{
for (int j = 0; j < element_matrix.Width; j++)
{
if (element_matrix[i, j] == finding_element)
{
Find_Row_List.Add(i);
Find_Col_List.Add(j);
}
}
});
});
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Это завершается за 240 мс.
Резюме
**Method Duration (ms)**
------------------------ ------------
Matlab 9.7
For Loop (Classic) 460
For Loop (10 threads) 310
For Loop (20 threads) 380
Parallel.For 224
Parallel.For(2 threads) 250
Все длительности в среднем равны 10. Вычисления.
Я пробую разные методы для расчета так же быстро, как Matlab.Самым быстрым решением является Parallel.For (224 мс).Но это в 25 раз медленнее, чем Matlab.Как я могу улучшить эту продолжительность?