1

いくつかのフィルターを使用して Exchange メッセージ追跡結果を収集し、件名に「*SPAM*」を含むアイテムを返す単純な Powershell スクリプトがあります。そのために、Microsoft.Exchange.Management.TransportLogSearchTasks.MessageTrackingEvent オブジェクトの配列を取得し、各エントリの MessageSubject プロパティをチェックする 'where' にパイプします。

MessageSubject プロパティを比較するために以下を使用すると、コードが 70,000 レコードまで完了するのに非常に長い時間 (時間) かかることがわかりました。

($_.messagesubject -like '`*SPAM`*')

ただし、次を使用すると、完了時間は秒単位です。

($_.messagesubject -match [regex]'^\*SPAM\*.*$')

前者の処理に時間がかかる特定の理由を特定しようとして、頭がいっぱいになっています。両方のメソッドが同じ数のオブジェクトをループする必要はありませんか? 文字ごとの比較 (-like) とコンパイルされた正規表現の違いはありますか? (-マッチ用)

4

1 に答える 1

7

バージョン間で変更されるのはオペレーターの切り替えだけですか? 以下のテストによると、オペレーターのパフォーマンスは問題ではありません。さらに、正規表現キャストは最も長いものです。また、使用する like パターンが間違っていると思います。アスタリスクは特殊なワイルドカード文字であるため、エスケープする必要があります ($sb4 を参照)。

PS> $msg = "just a sample spam message for testing"

PS> $sb1 = { 1..70000 | foreach {$msg -match [regex]'^\*SPAM\*.*$' } }
PS> $sb2 = { 1..70000 | foreach {$msg -match 'spam'} }
PS> $sb3 = { 1..70000 | foreach {$msg -like "*spam*" } }
PS> $sb4 = { 1..70000 | foreach {$msg -like "`*spam`*" } }    

PS> (measure-command $sb1).TotalSeconds
8.1869412

PS> (measure-command $sb2).TotalSeconds
6.7244995

PS> (measure-command $sb3).TotalSeconds
7.9287195

PS> (measure-command $sb4).TotalSeconds
6.9678701
于 2012-05-15T19:16:10.133 に答える