我有一个程序可以多次读取环境变量(不确定精确计数,但可能有数千个)。我想看看将它们放在字典中是否有意义,因为它一遍又一遍地使用大约5个变量。我的第一个想法是GetEnvironmentVariable可能不会花费太多开销,因为它总是会打击内存。我创建了以下测试:
Stopwatch sw = new Stopwatch();
sw.Start();
Dictionary<string, string> vals = new Dictionary<string, string>();
vals["TargetRoot"] = "Hey";
for (int i = 0; i < 5e6; i++)
{
var j = vals["TargetRoot"];
if (j != null && j.Equals("hello there" + i))
{
break;
}
}
Console.WriteLine("Dictionary: " + sw.Elapsed);
sw.Restart();
for (int i = 0; i < 5e6; i++)
{
var j = Environment.GetEnvironmentVariable("TargetRoot");
if (j != null && j.Equals("hello there" + i))
{
break;
}
}
Console.WriteLine("EnvVar: " + sw.Elapsed);
在这种情况下设置TargetRoot,但永远不会满足if条件。我添加if条件的原因是编译器不会短路。结果如下:
调试:
Dictionary: 00:00:00.8907373
EnvVar: 00:00:19.3848903
零售:
Dictionary: 00:00:00.8625990
EnvVar: 00:00:19.3109294
VS调试器中的调试:
Dictionary: 00:00:01.0370544
EnvVar: 00:00:04.9588787
您认为此测试是否值得信赖,我能否得出结论GetEnvironmentVariable比使用本地缓存慢5-20倍?请注意,似乎我的cpus在20秒内处于100%,所以我怀疑它比内存限制更多cpu绑定,但不是正面。