模擬:單執行緒處理很多數字的運算
先寫一個可以產生很多整數的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
internal class Program
{
static byte[] values = new byte[500000000]; //因為需要很多整數,會造成內存不足的異常,所以用byte
static void GenerateInts()
{
var rnd = new Random(); //使用隨機數
for (int i = 0; i < values.Length ; i++) {
values[i] = (byte)rnd.Next(10); //隨機產生的數字0-9放到陣列中
}
}
static void Main(string[] args)
{
}
}
對這些值進行相加(求和)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
internal class Program
{
static byte[] values = new byte[500000000];
static void GenerateInts()
{
var rnd = new Random();
for (int i = 0; i < values.Length ; i++) {
values[i] = (byte)rnd.Next(10);
}
}
static void Main(string[] args)
{
GenerateInts(); //產生很多整數
Console.WriteLine("Summing...");
//進行相加
long total = 0;
for (int i = 0; i < values.Length; i++) {
total += values[i];
}
Console.WriteLine($"Total value is: {total}");
}
}
執行結果:
(執行需要一點時間…)
1
2
Summing...
Total value is: 2250066839
使用 Stopwatch 取得效能數值(花了多少時間)
想知道它實際上花了多少時間來做加總
使用Stopwatch取得效能數值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
internal class Program
{
static byte[] values = new byte[500000000];
static void GenerateInts()
{
var rnd = new Random();
for (int i = 0; i < values.Length ; i++) {
values[i] = (byte)rnd.Next(10);
}
}
static void Main(string[] args)
{
GenerateInts(); //產生很多整數
Console.WriteLine("Summing...");
//使用Stopwatch來看花了多少時間加總
Stopwatch watch = new Stopwatch();
watch.Start();//開始計時
long total = 0;
for (int i = 0; i < values.Length; i++) {
total += values[i];
}
watch.Stop(); //結束計時
Console.WriteLine($"Total value is: {total}");
Console.WriteLine($"Time to sum. {watch.Elapsed}");
}
}
執行結果:
花了將近10.92秒
1
2
3
Summing...
Total value is: 2249935218
Time to sum: 00:00:10.9200492 ==> 10.92秒
##
試想,如果我把這些所有數字都放在RAM中、我挪有所有的CUP、把這些工作放在一個執行緒上…
如果我聰明的話,應該要將這些數據分開,分成多個執行緒,將數據加起來…
天真的假設我有8個CPU,將這些很長的數據分成8部分,再給每個執行緒添加相同數量的陣列,允許多個執行緒在自己一小部分中工作。