gpt4 book ai didi

正则表达式性能

转载 作者:行者123 更新时间:2023-12-02 22:31:06 25 4
gpt4 key购买 nike

我正在对 RegEx 的不同方法进行基准测试,发现了一些我真的不理解的东西。我特别比较了使用 -match 运算符与使用 [regex]::Matches() 加速器。我开始于

(Measure-Command {
foreach ($i in 1..10000) {
$path -match $testPattern
}
}).TotalSeconds
(Measure-Command {
foreach ($i in 1..10000) {
[regex]::Matches($path, $testPattern)
}
}).TotalSeconds

and -match 总是稍微快一点。但这也不是苹果对苹果,因为我需要将 [Regex] 结果分配给变量才能使用它。所以我补充说

(Measure-Command {
foreach ($i in 1..10000) {
$path -match $testPattern
}
}).TotalSeconds
(Measure-Command {
foreach ($i in 1..10000) {
$test = [regex]::Matches($path, $testPattern)
}
}).TotalSeconds

现在 [Regex] 始终稍快一些,这没有意义,因为我通过变量赋值增加了工作量。性能差异可以忽略不计,进行 10,000 次匹配时只有 1/100 秒,但我想知道在涉及变量赋值时,幕后发生了什么可以使 [Regex] 更快?

就其值(value)而言,在没有变量赋值的情况下,-match 更快,分别为 0.05 秒和 0.03 秒。使用变量赋值 [Regex] 比 0.02 秒快 0.03 秒。因此,虽然这一切都可以忽略不计,但添加变量可以将 [Regex] 处理时间减少一半以上,这是一个(相对)巨大的增量。

最佳答案

两个测试的输出不同。加速器输出更多的文本。

即使它们在包装在 Measure-Command cmdlet 中时不显示,它们也是计算的一部分。

$path -match $testPattern

的输出
$true

[regex]::Matches($path,$testPattern

的输出

Groups : {0}
Success : True
Name : 0
Captures : {0}
Index : 0
Length : 0
Value :

写东西很慢。在第二个示例中,您通过将加速器输出分配给变量来处理它。这就是它明显更快的原因。

您可以通过取消输出来查看没有分配的差异如果你这样做,你会发现加速器总是稍微快一点。


(Measure-Command {
foreach ($i in 1..10000) {
[void]($path -match $testPattern)
}
}).TotalSeconds
(Measure-Command {
foreach ($i in 1..10000) {
[void]([regex]::Matches($path, $testPattern))
}
}).TotalSeconds

补充说明

void 总是比 Command | 更有效。出空。流水线速度较慢,但​​内存效率高。

关于正则表达式性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63751834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com