PowerShellのループカウント
2008年 08月 08日
PowerShell (v1.0で検証) では、for 文を用いたループカウントより、foreach 文を用いたループカウントの方が、処理速度が上っぽいです。検証用の一行スクリプトを例示すると、
#for を用いたループカウント
[long]$sum=0;$t_start=(Get-Date);for([int]$i=1;$i -le 100000;++$i){$sum+=$i;};((Get-Date)-$t_start).TotalSeconds
上記よりも、
#foreachを用いたループカウント
[long]$sum=0;$t_start=(Get-Date);foreach($i in 1..100000){$sum+=$i;};((Get-Date)-$t_start).TotalSeconds
とした方が時間がかかりません。
しかも、カウンタ変数を、シェルやスクリプトのどこかでそれ以前に、[int]以外の型、例えば [double] 型などにしていて、それをそのまま使ってしまうと、for 文ではそのまま [double] として扱われ続けますが、foreach 文だと、ちゃんと[int]型として参照するので、不意のパフォーマンスダウンも避けられます。
ちなみに、foreach 文で使われた参照変数は、その後に何かを代入すると、もともと宣言されていた型に戻ります。
例えば、
[double]$a=0.0
foreach($a in 1..10){}
$a.GetType()
#ここでは Int32 型([int]型と同じ)と出る
$a = [int]1 #念入りに強制[int]型キャストで代入してみる
$a.GetType()
#ここでは Double 型と出る
#for を用いたループカウント
[long]$sum=0;$t_start=(Get-Date);for([int]$i=1;$i -le 100000;++$i){$sum+=$i;};((Get-Date)-$t_start).TotalSeconds
上記よりも、
#foreachを用いたループカウント
[long]$sum=0;$t_start=(Get-Date);foreach($i in 1..100000){$sum+=$i;};((Get-Date)-$t_start).TotalSeconds
とした方が時間がかかりません。
しかも、カウンタ変数を、シェルやスクリプトのどこかでそれ以前に、[int]以外の型、例えば [double] 型などにしていて、それをそのまま使ってしまうと、for 文ではそのまま [double] として扱われ続けますが、foreach 文だと、ちゃんと[int]型として参照するので、不意のパフォーマンスダウンも避けられます。
ちなみに、foreach 文で使われた参照変数は、その後に何かを代入すると、もともと宣言されていた型に戻ります。
例えば、
[double]$a=0.0
foreach($a in 1..10){}
$a.GetType()
#ここでは Int32 型([int]型と同じ)と出る
$a = [int]1 #念入りに強制[int]型キャストで代入してみる
$a.GetType()
#ここでは Double 型と出る
by mikamikanamiyuki | 2008-08-08 19:48 | プログラミング