web-dev-qa-db-ja.com

PowerShellは整数を文字列に変換するのが遅い

多くの整数を文字列に変換する必要があるPowerShellスクリプトを書いています。次のように、ToStringメソッドを使用してこれを実行しています。

$i = 5
$i.ToString()

残念ながら、これは非常に遅いようです(実行ポリシーの警告は省略しました)。

PS I:\ADCC\Scripting Performance> .\int_to_str.ps1
6.747561
PS I:\ADCC\Scripting Performance> .\int_to_str.py
0.37243021680382793

PowerShell 2とPython 3.を使用しています。

PS I:\ADCC\Scripting Performance> $PSVersionTable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.5485
BuildVersion                   6.1.7601.17514
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1


PS I:\ADCC\Scripting Performance> python --version
Python 3.6.1

これはint_to_str.ps1の内容です:

(Measure-Command {
    ForEach($i in 1..1000000){
        $i.ToString()
    }
}).TotalSeconds

これはint_to_str.pyの内容です:

#!/usr/bin/env python3
import time
start = time.perf_counter()
for i in range(1, 1000000):
    str(i)
print(time.perf_counter() - start)

ご覧のとおり、どちらのスクリプトも1から1,000,000の整数を文字列に変換します。ただし、PowerShellは6.75秒かかりますが、Pythonは0.37秒しかかかりません。Pythonが18倍速くなります。私が書いている実際のPowerShellスクリプトでは、すべての整数を文字列に変換するのに約3時間かかるので、18倍の速度の改善は歓迎されます。

PowerShell 2でintstringに変換するより速い方法はありますか?

5
wecsam

.NET(PowerShellで使用しているもの)でさえ、あなたの質問に答えるために、関心のあるint-> string変換に関するすばらしい記事を以下に示します。 http://cc.davelozinski.com/c-sharp/fastest-way-to-convert-an-int-to-string

ADからのバイト配列変換に関する限り、これは私が行ったテストであり、[string[]]への明示的なキャストにより、ほとんど常に.tostring()を使用した場合の利点が見られました。ゲインは50%から同等の範囲でしたが、一貫して高速でした。

$s = [adsisearcher]'(&(objectCategory=user)(samaccountname=mysam))'
$r = @($s.FindAll())

(Measure-Command {
    foreach ($b in $r[0].Properties.userpassword[0]) {
        $b.tostring()
    }
}).TotalSeconds

(Measure-Command {
    [string[]]$r[0].Properties.userpassword[0]
}).TotalSeconds
4
thepip3r

私は@ thepip3rの回答を受け入れましたが、質問のコメントから他のいくつかの可能な解決策を強調したいと思います。

  1. $i.ToString()の代わりに"$i"を使用できます。速いです。
  2. PowerShell 2を使用している場合は、Microsoftから新しいバージョンのWindows管理フレームワークをダウンロードしてみてください。 https://www.Microsoft.com/en-us/download/details.aspx?id=50395

コメントにさらにソリューションが表示されたら、これを編集します。

6
wecsam