7

簡単なステートメントをローカルで実行すると

$path = 'C:\Windows\System32\WindowsPowerShell\v1.0'
gci $path

すぐに反応が見えます。しかし、ローカルマシンでジョブとして実行すると

$start = get-date
$path = 'C:\Windows\System32\WindowsPowerShell\v1.0'
$cmd = [scriptblock]::Create("gci $path")
$jnr1 = Invoke-Command -computer localhost -ScriptBlock $cmd  -asJob
Wait-Job $jnr1
Receive-job $jnr1
$end = Get-date
($end - $start).totalseconds

55秒待たなければなりません。10 年前の私の UNIX の経験から。バックグラウンド ジョブはフォアグラウンド ジョブとほぼ同じ速度で実行されると思います。

PowerShell バックグラウンド ジョブの実行を高速化する方法はありますか?

4

3 に答える 3

4

この短いコマンドは同じことを行います:

Measure-Command {Start-Job -Command {gci C:\Windows\System32\WindowsPowerShell\v1.0} | Wait-Job | Receive-Job}

PSv3 を使用した Win8 ベータ版では約 3 秒、PSv2 を使用した WinXp では約 15 ~ 30 秒でした。

バックグラウンド ジョブは PsV2 で導入されました。v2 から最適化する時間があり、PowerShell はv3でDLRを使用するようになったため、パフォーマンスの違いが説明できるかもしれません。

コマンド テキストを使用して別の PowerShell プロセスを起動し、コマンドを実行し、シリアル化された結果を送り返し、プロセスを破棄する必要があります。

上記のコマンドの実行中に procmon を実行し、powershell.exe がネットワークと COM 関連の reg キーを読み取っている間、その動作を確認しました。

于 2012-05-13T20:37:42.570 に答える
0

あなたのデモは、私がテストした Windows サーバー上で非常に高速に動作します。この特定のケースでは、ジョブの問題ではなく、ローカルホストの呼び出しに問題があると思います! 代わりに 127.0.0.1 に変更してみてください。ローカルホストの解決に時間がかかりすぎたため、PHP アプリのパフォーマンスに問題がありました。それをIPアドレスに変更すると修正されました。試してみる。

関連する議論 https://forums.iis.net/t/1153459.aspx?PHP+very+slow+on+IIS7

于 2020-04-24T11:09:31.927 に答える