要通过 RDHS 优化代码,您实际上不需要保留字符串的大写版本。我认为这是尽可能优化的。
代码 1:
Private Function RandomCaps(s As String) As String
Dim i As Long
RandomCaps = LCase$(s)
For i = 1 To Len(s)
If Rnd < 0.5 Then
Mid(RandomCaps, i, 1) = UCase(Mid(RandomCaps, i, 1))
End If
Next i
End Function
上面的代码很好,但是,在非常大的字符串的情况下,您可能想试试这个(未测试性能与 RDHS 的代码):
代码 2:
Private Function RandomCaps(s As String) As String
Dim b() As Byte
b = StrConv(Text1.Text, vbFromUnicode)
Dim i As Long
For i = 0 To UBound(b) - 1
If Rnd < 0.5 Then
If UCase(Chr(b(i))) = Chr(b(i)) Then
'original char is uppercase, make it lowercase
b(i) = Asc(LCase(Chr(b(i))))
Else
'original char is lowercase, make it uppercase
b(i) = Asc(UCase(Chr(b(i))))
End If
End If
Next i
RandomCaps = StrConv(b, vbUnicode)
End Function
编辑:
我做了一些性能测试,上面两个代码之间的差异可以忽略不计:第二个代码块只比第一个快 1%。
编辑2:
忽略我之前的编辑。代码 2 的效率比代码 1 低大约 50%。但是,正如 RDHS 建议的那样,我调整了代码 2 来比较值,而不是从 CHR 到 ASC 来回比较,从大约 40 个字符的输入字符串开始效率更高长。输入字符串越长,code 3 的性能越好。对于长度为 944640 个字符的输入字符串,代码 3 比代码 1 快 57%。
统计:第一列是输入字符串的长度(以字符为单位) 第二列是 Code 3 与 Code 2 相比的效率。如您所见,字符串长度为 5 个字符,Code 2 效率提高了 46%。从 40 左右的字符串长度开始,代码 3 变得越来越高效。
5 -46.80%
50 6.22%
100 21.50%
500 38.54%
1000 41.11%
10000 44.87%
100000 43.25%
1260000 43.02%
代码 3:
Private Function RandomCaps(s As String) As String
Dim b() As Byte
b = StrConv(Text1.Text, vbFromUnicode)
Dim i As Long
For i = 0 To UBound(b) - 1
If Rnd < 0.5 Then
If b(i) >= 64 And b(i) <= 90 Then
'A to Z
b(i) = b(i) + 32
ElseIf b(i) >= 97 And b(i) <= 122 Then
'a to z
b(i) = b(i) - 32
Else
'everything else
End If
End If
Next i
RandomCaps = StrConv(b, vbUnicode)
End Function