.NET性能:为什么这个静态方法在第一次运行时需要这么长时间?

时间:2016-04-13 21:46:46

标签: c# .net performance hash profiling

我在我的控制台应用程序中有这个代码,我正在运行它以测量使用switch-case将字符串映射到字符的性能影响:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQYV2NgYAAAAAMAAWgmWQ0AAAAASUVORK5CYII=

以下是static void Main(string[] args) { for (int i = 0; i < 10; i++) { var watch = Stopwatch.StartNew(); HtmlEntities.Lookup("rfloor"); watch.Stop(); Console.WriteLine(watch.Elapsed); } } 背后代码的要点,其中包含一个方法:https://gist.github.com/jamesqo/3331a02f8168a6c782853556ac8f19e5

由于某种原因,当我运行上面的代码时,我在第一次迭代时始终获得一个非常高的数字,然后在下一次迭代时获得更小的数字。例如,以下是运行此操作后输出到控制台的示例:

HtmlEntities

任何人都可以解释为什么会这样吗?据我所知,该方法只是一个巨大的切换案例,它将特定的字符串映射到字符。它是否与必须在第一次尝试时计算字符串的哈希码有关,然后在后续迭代中它被缓存?

为了进行比较,here00:00:00.0348343 00:00:00.0000016 00:00:00.0000010 00:00:00.0000016 00:00:00.0000016 00:00:00.0000010 00:00:00.0000010 00:00:00.0000016 00:00:00.0000016 00:00:00.0000010 的替代版本,它在运行时初始化一个巨大的HtmlEntities,然后从中查找值。使用该实现,第一次迭代要快得多,但后续迭代不是那么快。这是使用该应用程序运行应用程序时的示例输出:

Dictionary

有人可以解释这种现象及其发生的原因吗?感谢。

0 个答案:

没有答案