是否值得在c#中缓存GetEnvironmentVariable?
我有一个程序,可以多次读取环境变量(不确定确切的计数,但可能有数千次)。我想看看把它们放在字典里是否有意义,因为它反复使用了大约5个变量。我的第一个想法是GetEnvironmentVariable可能不会占用太多的开销,因为它总是会占用内存。我创建了以下测试:是否值得在c#中缓存GetEnvironmentVariable?,c#,environment-variables,C#,Environment Variables,我有一个程序,可以多次读取环境变量(不确定确切的计数,但可能有数千次)。我想看看把它们放在字典里是否有意义,因为它反复使用了大约5个变量。我的第一个想法是GetEnvironmentVariable可能不会占用太多的开销,因为它总是会占用内存。我创建了以下测试: Stopwatch sw = new Stopwatch(); sw.Start(); Dictionary<string, string> vals = new Dictio
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);
零售:
Dictionary: 00:00:00.8625990
EnvVar: 00:00:19.3109294
在VS调试器中调试:
Dictionary: 00:00:01.0370544
EnvVar: 00:00:04.9588787
您认为这个测试值得信赖吗?我能否得出结论,GetEnvironmentVariable比使用本地缓存慢5-20倍?请注意,我的一个cpu在20秒内似乎达到了100%,因此我怀疑它的cpu限制大于内存限制,但不是正面的。我们真的应该为这种交易配备一个探查器。有些地方不对劲。在调试器之外运行时,第二部分的速度不应慢四倍。它看起来像是执行了一些字符串操作和对Windows API的调用。这并不是因为环境变量太慢,“问题”在于字典太快了。通过足够频繁地重复,您可以使任何快速代码花费5秒钟。总之,你的程序慢了几毫秒,用肉眼是看不到的。但是,如果你想写代码,那么不要让我们阻止你。关于@HansPassant讨论的内容:
GetEnvironmentVariable()
的速度是否真的会导致程序运行方式发生有意义的变化?通过使用字典
获得的速度是否值得您在编写/实现代码时付出努力?如果这两个问题的答案都是“是”,那就千方百计去做吧,但它实际上可能不会损害任何东西。我们真的应该为这类交易配备一个剖析器。有些事情不对。在调试器之外运行时,第二部分的速度不应慢四倍。它看起来像是执行了一些字符串操作和对Windows API的调用。这并不是因为环境变量太慢,“问题”在于字典太快了。通过足够频繁地重复,您可以使任何快速代码花费5秒钟。总之,你的程序慢了几毫秒,用肉眼是看不到的。但是,如果你想写代码,那么不要让我们阻止你。关于@HansPassant讨论的内容:GetEnvironmentVariable()
的速度是否真的会导致程序运行方式发生有意义的变化?通过使用字典
获得的速度是否值得您在编写/实现代码时付出努力?如果这两个问题的答案都是“是的”,那就千方百计去做,但它实际上可能不会伤害任何东西。
Dictionary: 00:00:01.0370544
EnvVar: 00:00:04.9588787