Spa*_*ack 4 .net powershell cmdlets
编写PowerShell脚本时,有两个选项可用:
在后台,cmdlet可能更多地使用.NET库.
性能明智的是,在Powershell脚本中哪一个更好用?
我倾向于更喜欢直接使用.NET库,因为它更接近C#.
Mat*_*sen 16
编写Powershell脚本时,有两个选项:
- 调用cmdlet
- 使用.NET Framework类库
TBH,我认为这是过于简单化的PowerShell的什么总值为.
值得指出的第一件事就是PowerShell中的(API 并在powershell.exe宿主应用程序)的.NET实现摆在首位,因此按照定义一切PowerShell是"使用.NET".
作为一个例子,cmdlet实际上是一个.NET对象 - 看一下返回的CmdletInfo对象Get-Command:
PS C:\> (Get-Command Get-Command) |Format-List Name,CommandType,DLL,ImplementingType
Name             : Get-Command
CommandType      : Cmdlet
DLL              : C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad36
                   4e35\System.Management.Automation.dll
ImplementingType : Microsoft.PowerShell.Commands.GetCommandCommand
看一下实现类型Microsoft.PowerShell.Commands.GetCommandCommand- 它只是一个常规的.NET类 - 当你发出命令时Get-Command,powershell会创建一个这个类的实例,调用一些定义良好的方法,然后调用执行该方法的.NET方法.实际工作.
PowerShell(或者Monad,最初称为Monad)背后的整个理念是,开发时间更好地专注于小型独立单元/功能,这些单元/功能做得很好(原始概念中的monad),就像原始版本一样UNIX实用程序背后的哲学
我们的想法是,一旦你有一个框架将这些单元连接在一起,你就可以通过连接更简单的单元来虚拟地编写任何程序.
这个想法的具体化是cmdlet - 它有一些明确定义的输入绑定行为,允许您组成管道:
Get-AThing | Filter-TheThing | Write-ToAFile C:\path\to\file\name.ext
在我看来,像上面这样的管道比例如更具可读性:
[System.IO.File]::WriteAllText('C:\path\to\file\name.ext', [System.Linq.Enumerable]::Select([Thing]::EnumerateThings(),{param([thing]$in) $in -eq $someCriteria}))
这是主观的,但我想要的是,你是在欺骗自己,而不是利用PowerShell免费提供的一些核心功能,如果你在路边放弃cmdlet的话
现在,对于实际问题:是的,直接调用单个.NET方法比调用cmdlet更快,并且产生的开销更少,这反过来使PowerShell运行一些额外的代码,最终只包装相同的.NET方法调用.
话虽这么说,如果您运行的是较新版本的PowerShell(4.0,5.0,5.1或6.0),在许多情况下开销几乎可以忽略不计.
例如,从磁盘读取文件的速度比解析已经存在于内存中的.NET方法调用链(这是PowerShell对您透明的那样)的速度要慢一些,这仅仅是因为将电子从旋转的磁盘移动到磁盘中控制器和存储器总线进入存储器是由光速限制的操作.
我个人优化性能的策略是在我开始考虑cmdlet与直接方法调用之前,检查我使用的算法/例程和数据结构.
如果我做了一些愚蠢的事情,使我的脚本需要10倍的CPU周期来计算,那么它将无助于尝试追逐边际开销.
如果你已经达到了这个策略的极限,考虑在C#或VB.NET中编写你的cmdlet - 编译代码(几乎)总是比解释代码更快:-)
| 归档时间: | 
 | 
| 查看次数: | 2810 次 | 
| 最近记录: |