PowerShell条件效率:-match vs. -like

时间:2012-05-15 14:39:18

标签: regex performance powershell

我有一个简单的Powershell脚本,它使用一些过滤器收集Exchange邮件跟踪结果,然后使用' * SPAM *'在这个主题。为此,我获取一个Microsoft.Exchange.Management.TransportLogSearchTasks.MessageTrackingEvent对象的数组,并将其传递给'其中'检查每个条目的MessageSubject属性。

我发现当我使用以下内容来比较MessageSubject属性时,代码需要很长的时间(小时)来完成约70,000条记录:

($ _。Messagesubject -like'`* SPAM` *')

但是当我使用以下内容时,完成时间以秒为单位:

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

我试图确定前者花费这么长时间来处理的具体原因。不要两种方法都需要循环相同数量的对象吗?逐字符比较(for -like)与编译正则表达式的区别是什么? (for -match)

1 个答案:

答案 0 :(得分:7)

您确定切换操作符是版本之间唯一的变化吗?根据以下测试,运营商的表现不是问题。而且,正则表达式是最长的。我也相信你使用的模式是错误的,你需要逃避星号,因为它们是特殊的通配符(参见$ 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