using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Prog20180921
{
class Program
{
static void Main(string[] args)
{
int[] arr1 = new int[1000000];
var rand = new Random();
for (int i = 0; i < arr1.Length; i++)
{
arr1[i]=rand.Next(100,300);
}
var time1 = DateTime.Now.Millisecond;
long res1 = OneThread(arr1);
var time2 = DateTime.Now.Millisecond;
long res2 = ParallelThread(arr1);
var time3 = DateTime.Now.Millisecond;
Console.WriteLine("{0} {1}",
time2-time1, time3-time2);
}
private static long ParallelThread(int[] arr)
{
int numCores = Environment.ProcessorCount;
object[] locks = new object[numCores];
for (int i = 0; i < locks.Length; ++i)
locks[i] = new object();
long[] sums = new long[numCores];
Parallel.For(0, arr.Length, (i) =>
{
lock (locks[i % numCores])
sums[i % numCores] += arr[i];
});
long res = 0;
foreach (var item in sums) res += item;
return res;
}
private static long OneThread(int[] arr)
{
long res = 0;
for (int i = 0; i < arr.Length; i++)
{
res += arr[i];
}
return res;
}
}
}
Comments