我有2个大小相等的数组,我想通过循环执行一些逻辑。它适用于小型数组,但当我在数组中加载数百万个项目时挂起
我尝试使用Parallel.ForEach但那里没有运气。这是我的代码
for (int i = 0; i < items1.Length - 1; i++)
{
for (int j = i + 1; j < items1.Length; j++)
{
if (((items1[i] < items1[j]) & (items2[i] < items2[j])) | ((items1[i] > items1[j]) & (items2[i] > items2[j])))
{
values1++;
}
else if (((items1[i] > items1[j]) & (items2[i] < items2[j])) | ((items1[i] < items1[j]) & (items2[i] > items2[j])))
{
values2++;
}
}
}
当数组中的数据超过一百万时,如何重新编写此代码以提高性能?
答案 0 :(得分:0)
有了并行性和一些小的优化,它快了将近4倍。
Random random = new Random(0);
int[] items1 = Enumerable.Range(1, 5000)
.OrderBy(n => random.Next()).ToArray(); // Suffled numbers 1-5000
int[] items2 = Enumerable.Range(1, 5000)
.OrderBy(n => random.Next()).ToArray(); // Suffled numbers 1-5000
long values1 = 0;
long values2 = 0;
var options = new ParallelOptions()
{ MaxDegreeOfParallelism = Environment.ProcessorCount };
Parallel.For(0, items1.Length - 1, options,
() => (0L, 0L),
(i, state, local) =>
{
var (localValues1, localValues2) = local;
var items1_i = items1[i];
var items2_i = items2[i];
for (int j = i + 1; j < items1.Length; j++)
{
var items1_j = items1[j];
var items2_j = items2[j];
if (((items1_i < items1_j) && (items2_i < items2_j))
|| ((items1_i > items1_j) && (items2_i > items2_j)))
{
localValues1++;
}
else if (((items1_i > items1_j) && (items2_i < items2_j))
|| ((items1_i < items1_j) && (items2_i > items2_j)))
{
localValues2++;
}
}
return (localValues1, localValues2);
}, local =>
{
var (localValues1, localValues2) = local;
Interlocked.Add(ref values1, localValues1);
Interlocked.Add(ref values2, localValues2);
});
Console.WriteLine($"values1: {values1}, values2: {values2}");
输出:
values1:6282046,values2:6215454