VB.net 中的选项比较文本*非常*慢?

问题描述 投票:0回答:1

我最近才了解到

Option Compare Text
,所以我写了一个小测试:

Dim sw As New Stopwatch()
Dim w As Boolean = False
sw.Reset()
sw.Start()
Dim A As String = "hello, world"
For o As Integer = 1 To 1000000
    If A = "HELLO, world" Then
        w = True
    End If
Next o
sw.Stop()
Console.WriteLine(sw.Elapsed.TotalMilliseconds & vbTab & w.ToString)

如果没有该选项,运行时间约为 6 毫秒,打开该选项则运行时间约为 450 毫秒。

我并不完全惊讶于它需要更长的时间,但其幅度却令人惊讶。例如:

If A.Equals("HELLO, world", StringComparison.CurrentCultureIgnoreCase) Then

...需要 135 毫秒。

任何人都可以解释为什么与 Equals 方法相比,使用此选项和 = 需要花费更长的时间?

vb.net string-comparison
1个回答
0
投票

嗯,一个示例进行高速 CPU 二进制比较,另一个示例必须将所有字符转换为小写(或大写???)大小写,然后进行字符串比较。

我无法想象有人认为不进行任何类型的字符串转换以忽略大小写的原始二进制比较运行得比必须将两个字符串转换为常见大小写的代码运行得更快,必须比较字符串来代替原始二进制数据?

因此,这里并不令人意外,因为必须转换两个字符串,并进行字符串比较。

另一个示例不进行字符串转换,不必将字符串(两者)复制到新位置(用于大小写转换),然后必须基于两个全新的值进行全新的字符串比较在内存中,在一个全新的内存位置!所有这一切不仅必须发生在两个值的副本上,而且这两个值都需要转换为常见情况!

因此,不仅两个字符串的大小写需要转换,而且这意味着两个字符串的副本也必须发生!

考虑到大量的额外内存和额外的处理,以及必须复制两个值,请求更多和新的内存位置,然后必须将两个字符串转换为常见的大小写格式?

我得到 4.8 vs 279。所以,是的,它慢了大约 58 倍,上面解释了原因!因此,CPU 不仅被迫进行字符串比较(而不是更快的二进制比较),而且还需要两个值的副本,这意味着需要内存来存储两个值的副本发生。然后,在复制两个值之后,必须对每个字符串进行大小写转换(逐字节),然后才能进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.