为什么第二次使用PowerShell的LINQ调用要快得多

时间:2017-05-03 04:08:34

标签: c# linq powershell clr

请考虑以下PowerShell代码:

PS> [int[]] $numbers = 1..10000
PS> (measure-command { [Linq.Enumerable]::Sum($numbers) }).TotalMilliseconds
28.8624

如果我再简单地重复相同的Measure-Command调用,它的运行速度会快一个数量级:

PS> (measure-command { [Linq.Enumerable]::Sum($numbers) }).TotalMilliseconds
2.6828

随后的重复变化但在同一范围内:

PS> (measure-command { [Linq.Enumerable]::Sum($numbers) }).TotalMilliseconds
1.504
PS> (measure-command { [Linq.Enumerable]::Sum($numbers) }).TotalMilliseconds
2.0782
PS> (measure-command { [Linq.Enumerable]::Sum($numbers) }).TotalMilliseconds
1.3351

从CLR调用方法有什么样的开销?这只是加载然后缓存程序集或其他东西的时间......?

2 个答案:

答案 0 :(得分:1)

第一次,必须加载System.Core dll。这需要文件读取,并且可以解释您看到的开销。

Procmon Trace

答案 1 :(得分:0)

  

CLR在执行期间根据需要转换MSIL,并将生成的本机代码存储在内存中,以便在该进程的上下文中进行后续调用。

我认为第一次将托管代码转换为本机代码,然后将其缓存在内存中。

点击此链接:https://msdn.microsoft.com/en-us/library/k5532s8a(v=vs.110).aspx