과학 설정
먼저, 이것을 테스트하는 데 도움이되는 스크립트가 있습니다. 이렇게하면 각각 하나의 작은 기능을 가진 2000 개의 스크립트 파일이 생성됩니다.
1..2000 | % { "Function Test$_(`$someArg) { Return `$someArg * $_ }" > "test$_.ps1" }
정상적인 시작 오버 헤드를 그리 중요하게 만들 수는 없습니다. 원한다면 더 추가 할 수 있습니다. 그러면 점 소싱을 사용하여 모두로드됩니다.
dir test*.ps1 | % {. $_.FullName}
먼저 내용을 먼저 읽어서 모두로드합니다.
dir test*.ps1 | % {iex (gc $_.FullName -Raw)}
이제 PowerShell의 작동 방식을 심각하게 검사해야합니다. 디 컴파일러로 JetBrains dotPeek 을 좋아 합니다. .NET 응용 프로그램에 PowerShell 을 포함 하려고 시도한 경우 대부분의 관련 항목이 포함 된 어셈블리는 System.Management.Automation
. 프로젝트와 PDB로 디 컴파일하십시오.
이 모든 신비한 시간이 어디에서 소비되는지 확인하기 위해 프로파일 러를 사용합니다. Visual Studio에 내장 된 것을 좋아합니다. 사용하기 매우 쉽습니다 . PDB를 포함하는 폴더를 심볼 위치에 추가합니다 . 이제 테스트 스크립트 중 하나만 실행하는 PowerShell 인스턴스의 프로파일 링 실행을 수행 할 수 있습니다. ( -File
첫 번째 스크립트의 전체 경로와 함께 사용할 명령 줄 매개 변수를 설정하십시오. 시작 위치를 모든 작은 스크립트가 포함 된 폴더로 설정하십시오.) 일단 완료되면 powershell.exe
대상 아래 의 항목에서 특성을 열고 변경하십시오. 다른 스크립트를 사용하기위한 인수 그런 다음 Performance Explorer에서 최상위 항목을 마우스 오른쪽 단추로 클릭하고 프로파일 링 시작을 선택 하십시오.. 프로파일 러는 다른 스크립트를 사용하여 다시 실행됩니다. 이제 비교할 수 있습니다. 옵션이 제공되면 "모든 코드 표시"를 클릭하십시오. 저에게는 샘플 프로파일 링 보고서의 요약보기에있는 알림 영역에 표시됩니다.
결과는
내 컴퓨터에서 Get-Content
버전은 2000 스크립트 파일을 통과하는 데 9 초가 걸렸습니다. "Hot Path"의 중요한 기능은 다음과 같습니다.
Microsoft.PowerShell.Commands.GetContentCommand.ProcessRecord
Microsoft.PowerShell.Commands.InvokeExpressionCommand.ProcessRecord
이것은 많은 이해 : 우리는 기다릴 필요가 Get-Content
디스크에서 콘텐츠를 읽는, 우리는 기다릴 필요가 Invoke-Expression
그 내용의 메이크업의 용도에 관한 것이다.
도트 소스 버전에서 내 컴퓨터는 해당 파일을 처리하는 데 15 초가 조금 걸렸습니다. 이번에는 Hot Path의 기능이 기본 메소드였습니다.
WinVerifyTrust
CodeAuthzFullyQualifyFilename
두 번째 문서는 문서화되지 않은 것으로 보이지만 WinVerifyTrust
"지정된 개체에 대한 트러스트 확인 작업을 수행합니다." 그것은 당신이 얻을 수있는 한 모호하지만 다른 말로하면, 그 기능은 주어진 공급자를 사용하여 주어진 자원의 신뢰성을 확인합니다. PowerShell에 멋진 보안 기능을 활성화하지 않았으며 스크립트 실행 정책은 Unrestricted
입니다.
그 의미
요컨대, 실행이 허용되는 스크립트를 제한하지 않을 때 필요하지 않더라도 각 파일이 어떤 방식으로 확인되기를 기다리고 있습니다. 서명이 있는지 확인하십시오. 사용자 gc
와 iex
컨텐츠가 콘솔에 기능을 입력 한 것과 같으므로 확인할 자원이 없습니다.