Налагодження науки
По-перше, кілька сценаріїв, які допоможуть нам перевірити це. Це генерує 2000 файлів скриптів, кожен з яких має одну маленьку функцію:
1..2000 | % { "Function Test$_(`$someArg) { Return `$someArg * $_ }" > "test$_.ps1" }
Цього повинно бути достатньо, щоб нормальний пусковий наклад не мав великого значення. Ви можете додати більше, якщо хочете. Це завантажує їх усіх за допомогою точкового пошуку:
dir test*.ps1 | % {. $_.FullName}
Це завантажує їх усіх, спочатку читаючи їхній вміст:
dir test*.ps1 | % {iex (gc $_.FullName -Raw)}
Тепер нам потрібно провести серйозну перевірку того, як працює PowerShell. Мені подобається JetBrains dotPeek для декомпілятора. Якщо ви коли-небудь намагалися вставити PowerShell в додаток .NET , ви побачите, що збірка, яка включає більшість відповідних матеріалів, є System.Management.Automation
. Декомпілюйте цю програму в проект та PDB.
Щоб побачити, де проводиться весь цей загадковий час, ми скористаємося профілером. Мені подобається вбудований у Visual Studio. Це дуже просто у використанні . Додайте папку, що містить PDB, до місць символів . Тепер ми можемо виконати профільний екземпляр PowerShell, який просто запускає один із тестових сценаріїв. (Встановіть параметри командного рядка для -File
повного шляху першого сценарію для спроби. Встановіть місце запуску в папку, що містить усі крихітні сценарії.) Після того, як це буде зроблено, відкрийте Властивості для powershell.exe
запису в розділі Цілі та змініть аргументи для використання іншого сценарію. Потім клацніть правою кнопкою миші найвищий елемент у програмі «Провідник продуктивності» та виберіть « Почати профілювання». Профілер знову запускається за допомогою іншого сценарію. Тепер ми можемо порівняти. Переконайтесь, що ви натискаєте "Показати весь код", якщо вам надана можливість; для мене це відображається в області сповіщень у підсумковому перегляді зразка звітності про моделювання.
Результати приходять
На моїй машині у Get-Content
версії 2000 сценаріїв знадобилося 9 секунд. Важливими функціями на "Гарячому шляху" були:
Microsoft.PowerShell.Commands.GetContentCommand.ProcessRecord
Microsoft.PowerShell.Commands.InvokeExpressionCommand.ProcessRecord
Це має багато сенсу: нам потрібно чекати, Get-Content
щоб прочитати вміст з диска, і нам доведеться чекати, Invoke-Expression
щоб скористатися цим вмістом.
У версії дот-джерела моя машина витратила трохи більше 15 секунд на обробку цих файлів. Цього разу функції на "Гарячому шляху" були нативними методами:
WinVerifyTrust
CodeAuthzFullyQualifyFilename
Другий там, як видається, недокументований, але WinVerifyTrust
"виконує дію перевірки довіри на визначеному об'єкті". Це приблизно настільки розпливчасто, як ви можете отримати, але іншими словами, ця функція перевіряє справжність даного ресурсу за допомогою даного постачальника. Зауважте, що для PowerShell я не ввімкнув будь-яких фантазійних питань безпеки, і моя політика виконання сценарію така Unrestricted
.
Що це означає
Коротше кажучи, ви чекаєте, коли кожен файл якимось чином перевірятиметься, ймовірно, перевіряється на підпис, хоча це не потрібно, коли ви не обмежуєте сценарії, дозволені до запуску. Коли ви, gc
а потім iex
вміст, це як би ви набрали функції на консолі, тому немає ресурсу для перевірки.