是否值得在c#中缓存GetEnvironmentVariable?

是否值得在c#中缓存GetEnvironmentVariable?,c#,environment-variables,C#,Environment Variables,我有一个程序,可以多次读取环境变量(不确定确切的计数,但可能有数千次)。我想看看把它们放在字典里是否有意义,因为它反复使用了大约5个变量。我的第一个想法是GetEnvironmentVariable可能不会占用太多的开销,因为它总是会占用内存。我创建了以下测试: Stopwatch sw = new Stopwatch(); sw.Start(); Dictionary<string, string> vals = new Dictio

我有一个程序,可以多次读取环境变量(不确定确切的计数,但可能有数千次)。我想看看把它们放在字典里是否有意义,因为它反复使用了大约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);
零售:

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