切换与If-Else性能

时间:2016-04-15 14:34:53

标签: performance powershell if-statement switch-statement

我有一个If块,它在我正在重写的登录脚本中:

If ($distinguishedname -match 'Joe Bloggs') {
    Map-Drive 'X' "\\path\to\drive"
}
If ($distinguishedname -match 'Steve Bloggs') {
    Map-Drive 'X' "\\path\to\drive"
}
If ($distinguishedname -match 'Joe Jobs') {
    Map-Drive 'X' "\\path\to\drive"
}

显然需要将其重写为If/Else语句(因为每个用户只有1个名字!)但是,我更喜欢以下switch -Regex方法的外观:

switch -Regex ($distinguishedname) {
    'Joe Bloggs' {Map-Drive 'X' "\\path\to\drive"; break}
    'Steve Bloggs' {Map-Drive 'X' "\\path\to\drive"; break}
    'Joe Jobs' {Map-Drive 'X' "\\path\to\drive"; break}
}

我的问题是 - 以这种方式使用开关会对此功能的性能产生什么影响?它必须优于上述(if/if/if),因为并非每次评估每种可能性,但switch是否会比ifelse/ifelse/else更快?

2 个答案:

答案 0 :(得分:4)

我写了这个测试来检查我是否可以找出使用Measure-Command更好的方法:

function switchtest {
    param($name)

    switch -Regex ($name) {
        $optionsarray[0] {
            Write-host $name
            break
        }
        $optionsarray[1] {
            Write-host $name
            break
        }
        $optionsarray[2] {
            Write-host $name
            break
        }
        $optionsarray[3] {
            Write-host $name
            break
        }
        $optionsarray[4] {
            Write-host $name
            break
        }
        default { }
    }
}
function iftest {
    param($name)

    If ($name -match $optionsarray[0]) {Write-host $name}
    ElseIf ($name -match $optionsarray[1]) {Write-host $name}
    ElseIf($name -match $optionsarray[2]) {Write-host $name}
    ElseIf($name -match $optionsarray[3]) {Write-host $name}
    ElseIf($name -match $optionsarray[4]) {Write-host $name}
}

$optionsarray = @('Joe Bloggs', 'Blog Joggs', 'Steve Bloggs', 'Joe Jobs', 'Steve Joggs')
for ($i=0; $i -lt 10000; $i++) {
    $iftime = 0
    $switchtime = 0

    $rand = Get-Random -Minimum 0 -Maximum 4
    $name = $optionsarray[$rand]

    $iftime = (Measure-Command {iftest $name}).Ticks
    $switchtime = (Measure-Command {switchtest $name}).Ticks

    Add-Content -Path C:\path\to\outfile\timetest.txt -Value "$switchtime`t$iftime"
}

<强>结果

平均而言,这是10,000次测试中每项功能的执行方式:

  

Switch - 11592.8566

     

IfElse - 15740.3281

结果不是最一致的(有时switch更快,有时ifelse更快)但是switch总体上更快(平均而言)我将使用此代替ifelse

非常感谢有关此决定和我的测试的任何反馈。

答案 1 :(得分:2)

通常,switch语句通过在汇编代码中构建跳转表并使用它来确定适当的路由而不是使用if / else之类的比较器来工作。这就是切换语句更快的原因。我相信使用字符串,编译器会生成字符串的哈希码,并使用它来实现跳转表,以便switch语句更快。所以switch语句应该比if / if /更快,如果你已经写过,但它可能不是因为switch语句通常依赖于有些均匀间隔的选项(例如1 2 3或5 10) 15)。

话虽如此,为什么不使用if / else-if / else-if而不是if / if / if?这肯定会更快,因为每次都不会评估每个选项。