我有以下代码将以下格式的字符串转换为
"G##"
整数##
Dim str As String
Dim int As Integer
str = "G14"
int = CInt(Right(str, Len(str) - 1))
但这将定期在大型数据库上运行。
我想知道是否有任何可能更有效的替代方案(尤其是关于最后一行)?
我有以下代码将以下格式的字符串转换为
"G##"
整数##
Dim str As String
Dim int As Integer
str = "G14"
int = CInt(Right(str, Len(str) - 1))
但这将定期在大型数据库上运行。
我想知道是否有任何可能更有效的替代方案(尤其是关于最后一行)?
我针对 int = CInt(Mid$(str, 2)) 尝试了您的代码 100,000,000 次迭代,并且 Mid$ 语句稍快(在我的机器上为 6 秒),但这是很多迭代。但是,当我将$添加到您的 Right 函数时,它们以相同的速度运行。与变体版本相比,使用字符串函数Right$
对字符串进行了更好的优化Right
。所以唯一的建议是我必须使用字符串优化版本 Right$。
Dim str As String
Dim int As Integer
str = "G14"
int = CInt(Right$(str, Len(str) - 1))
在我的测试中使用
Mid$(strTest, 1, 1) = "0"
lngTest = CLng(strTest)
比使用快 30-40%
CLng(Right$(strTest, Len(strTest) - 1))
这反过来又比
CLng(Right(strTest, Len(strTest) - 1))
我使用Long
它,因为它在速度方面非常出色Integer
对于多个替换,一个RegExp
可能会成为它自己的。开销太高,无法证明此示例的合理性
测试代码
Sub Test()
Dim dbTime As Double
Dim strTest As String
Dim lngTest As Long
Dim lngCnt As Long
strTest = "G14"
dbTime = Timer
For lngCnt = 1 To 1000000
lngTest = CLng(Right$(strTest, Len(strTest) - 1))
Next lngCnt
Debug.Print Timer - dbTime
dbTime = Timer
For lngCnt = 1 To 1000000
lngTest = CLng(Right(strTest, Len(strTest) - 1))
Next lngCnt
Debug.Print Timer - dbTimer
dbTime = Timer
For lngCnt = 1 To 1000000
Mid$(strTest, 1, 1) = "0"
lngTest = CLng(strTest)
Next lngCnt
Debug.Print Timer - dbTime
End Sub