意外的发现 —— Log 时间成本

上篇文章无意中发现了如果把 logger 单独拉一个线程会极大提高运行速度。这篇文章就来测试一下究竟能提速多快。

就简单看从 0 加到 100,000 的时间。

主线程打印
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static Stopwatch watcher;
static int i = 0;
static void Main(string[] args)
{
watcher = new Stopwatch();
watcher.Start();
for (; i < 100000; i++) {
Console.Clear();
Console.WriteLine(i);
}
watcher.Stop();
Console.WriteLine("共花费 {0} 毫秒", watcher.ElapsedMilliseconds);
}

结果:

99999
共花费 13318 毫秒

再来看看如果把 log 语句放在新线程里:

新线程打印
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static Stopwatch watcher;
static int i = 0;
static void Main(string[] args)
{
watcher = new Stopwatch();
watcher.Start();
new Thread(logger).Start();
for (; i < 100000; i++) ;
watcher.Stop();
Console.WriteLine("共花费 {0} 毫秒", watcher.ElapsedMilliseconds);
}
static void logger() {
while (i < 100000)
{
Console.Clear();
Console.WriteLine(i);
}
}

结果:

共花费 1 毫秒
100000

我勒个去啊,我试着继续增大数值,增加到 10,000,000 时,花了 34 毫秒。可以预计如果在主线程里打印,应该会花 1331800 毫秒。

所以以后涉及到大量循环的地方一定不要在里面写打印语句。。。。。。