[我正在尝试使用Vector来比传统的for循环更快地从2个数组中添加整数值。
[我的向量计数为:4,这意味着addArrays_Vector
函数应比:addArrays_Normally
运行大约快4倍
var vectSize = Vector<int>.Count;
然而奇怪的是这些基准:addArrays_Normally takes 475 milliseconds
addArrays_Vectortakes 627 milliseconds
这怎么可能? addArrays_Vector
不应该只花费大约120毫秒吗?我想知道我做错了吗?
void runVectorBenchmark()
{
var v1 = new int[92564080];
var v2 = new int[92564080];
for (int i = 0; i < v1.Length; i++)
{
v1[i] = 2;
v2[i] = 2;
}
//new Thread(() => addArrays_Normally(v1, v2)).Start();
new Thread(() => addArrays_Vector(v1, v2, Vector<int>.Count)).Start();
}
void addArrays_Normally(int[] v1, int[] v2)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
int sum = 0;
int i = 0;
for (i = 0; i < v1.Length; i++)
{
sum = v1[i] + v2[i];
}
stopWatch.Stop();
MessageBox.Show("stopWatch: " + stopWatch.ElapsedMilliseconds.ToString() + " milliseconds\n\n" );
}
void addArrays_Vector(int[] v1, int[] v2, int vectSize)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
int[] retVal = new int[v1.Length];
int i = 0;
for (i = 0; i < v1.Length - vectSize; i += vectSize)
{
var va = new Vector<int>(v1, i);
var vb = new Vector<int>(v2, i);
var vc = va + vb;
vc.CopyTo(retVal, i);
}
stopWatch.Stop();
MessageBox.Show("stopWatch: " + stopWatch.ElapsedMilliseconds.ToString() + " milliseconds\n\n" );
}
两个功能不同。并且看起来RAM内存是这里的瓶颈:
在第一个示例中
var v1 = new int[92564080];
var v2 = new int[92564080];
...
int sum = 0;
int i = 0;
for (i = 0; i < v1.Length; i++)
{
sum = v1[i] + v2[i];
}
代码一次读取两个数组。因此,内存消耗为:sizeof(int)
*92564080
*2
==4 * 92564080 * 2
== 706 MB。
在第二个示例中
var v1 = new int[92564080];
var v2 = new int[92564080];
...
int[] retVal = new int[v1.Length];
int i = 0;
for (i = 0; i < v1.Length - vectSize; i += vectSize)
{
var va = new Vector<int>(v1, i);
var vb = new Vector<int>(v2, i);
var vc = va + vb;
vc.CopyTo(retVal, i);
}
代码正在读取2个输入数组并写入一个输出数组。内存消耗至少为sizeof(int)
*92564080
*3
== 1 059 MB