我正在尝试找出迭代多维C#数组的最快方法。我已经删除了所有域代码以专注于该问题。此时,这将在1.86秒内执行,在此时执行大约25,000,000次迭代,处理5000个数组元素。我的目标是在2天内尽可能地降低1.86秒: - )
在现实世界中,处理它将更像是50,000²。
我尝试过使用PLINQ,但似乎线程开销实际上让它变慢了(来自3.48秒)。
我认为不安全的C#可能是要走的路,然而,在我走这条路之前,我会对如何改善性能的想法表示赞赏?我之前没有做过不安全的C#,所以我不确定它是否会带来性能提升?!
Console.WriteLine("started");
var sw = System.Diagnostics.Stopwatch.StartNew();
long iterations = 0;
string[] data = new string[5000];
string[] data2 = new string[5000];
string[] data3 = new string[5000];
int ubound = data.GetUpperBound(0);
for (int i = 0; i <= ubound; i++)
{
string d1 = data[i];
string d2 = data2[i];
string d3 = data3[i];
for (int j = 0; j < ubound; j++)
{
string e1 = data[j];
string e2 = data2[j];
string e3 = data3[j];
Interlocked.Increment(ref iterations);
}
Interlocked.Increment(ref iterations);
}
Console.WriteLine("Finished {0} iterations in {1} seconds", iterations, sw.Elapsed.TotalSeconds);
答案 0 :(得分:0)
不是多维数组,而是使用数学来解决它:
Console.WriteLine("started");
var sw = System.Diagnostics.Stopwatch.StartNew();
long iterations = 0;
var width=5000;
var height=3;
string[] data = new string[width*height];
for (int i = 0; i < width; i++)
{
string d1 = data[i];
string d2 = data[width+i];
string d3 = data[width*2+i];
for (int j = 0; j < width; j++)
{
string e1 = data[j];
string e2 = data[width+j];
string e3 = data[width*2+j];
Interlocked.Increment(ref iterations);
}
//});
Interlocked.Increment(ref iterations);
}
Console.WriteLine("Finished {0} iterations in {1} seconds", iterations, sw.Elapsed.TotalSeconds);
答案 1 :(得分:0)
是否需要Interlocked.Increment()调用来表示实际问题?从您编写的代码开始,这些调用可能会占用最大的时间。由于没有对局部变量迭代的多线程访问,因此可以取消调用。