gpt4 book ai didi

delphi - 不区分大小写 位置

转载 作者:行者123 更新时间:2023-12-03 14:37:56 31 4
gpt4 key购买 nike

在 D2010 (unicode) 中是否有像 Pos 这样不区分大小写的类似函数?

我知道我可以使用 Pos(AnsiUpperCase(FindString), AnsiUpperCase(SourceString)),但这会在每次调用函数时将字符串转换为大写,从而增加大量处理时间。

例如,在 1000000 次循环中,Pos 需要 78ms,而转换为大写需要 764ms。

str1 := 'dfkfkL%&/s"#<.676505';
for i := 0 to 1000000 do
PosEx('#<.', str1, 1); // Takes 78ms

for i := 0 to 1000000 do
PosEx(AnsiUpperCase('#<.'), AnsiUpperCase(str1), 1); // Takes 764ms

我知道为了提高这个特定示例的性能,我可以在循环之前先将字符串转换为大写,但我希望有一个不区分大小写的类似 Pos 的函数的原因是替换一张来自 FastStrings。我将使用 Pos 的所有字符串都会有所不同,因此我需要将每个字符串都转换为大写。

还有其他函数可能比 Pos + 将字符串转换为大写更快吗?

最佳答案

执行此操作的内置 Delphi 函数位于 AnsiStrings.ContainsText 中对于 AnsiStrings 和 StrUtils.ContainsText对于 Unicode 字符串。

然而,在后台,他们使用的逻辑与您的逻辑非常相似。

无论在哪个库中,这样的函数总是很慢:尤其是为了尽可能兼容 Unicode,它们需要有相当多的开销。由于它们位于循环内部,因此成本很高。

避免这种开销的唯一方法是尽可能在循环之外进行这些转换。

所以:按照你自己的建议,你就有了一个非常好的解决方案。

--杰罗恩

关于delphi - 不区分大小写 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1549145/

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