7,759
社区成员
发帖
与我相关
我的任务
分享
Private Type SafeArrayBound Elements As Long lLbound As Long End Type Private Type SAFEARRAY Dimension As Integer Features As Integer Element As Long Locks As Long Pointer As Long Bounds As SafeArrayBound End Type Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDst As Any, lpSrc As Any, ByVal ByteLength As Long) Private Declare Function GetTickCount Lib "kernel32" () As Long Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long Private Sub Command1_Click() Dim Sa As SAFEARRAY, StrData() As Byte Dim Str As String, Length As Long Dim I As Long, T As Double Str = String(190000, Chr(0)) Length = Len(Str) I = ((Rnd * 1000) Mod 100) + 1 Mid(Str, 500, 1) = Chr(I) With Sa .Element = 1 .Dimension = 1 .Bounds.Elements = Length .Pointer = StrPtr(Str) End With CopyMemory ByVal VarPtrArray(StrData()), VarPtr(Sa), 4 T = Timer For I = Length - 1 To 0 Step -1 If StrData(I) <> 0 Then Debug.Print I Exit For End If Next CopyMemory ByVal VarPtrArray(StrData()), 0&, 4 End Sub
Private Sub Form_Load()
Dim w As Long
Dim buff As String
Randomize
buff = String(190000, Chr(0))
p = ((Rnd * 1000) Mod 100) + 1 ' p 是一个不固定的值, 所以无法用 InStrRev() 查找
Mid(buff, 189999, 1) = Chr(p)
t = Timer
'For w = Len(buff) To 1 Step -1
'If Asc(Mid(buff, w)) <> 0 Then
'buff = Left(buff, w)
'Exit For
'End If
'Next
For w = 1 To 190000
If Mid(buff, w, 1) <> Chr(0) Then Debug.Print w: Exit For
Next
Debug.Print Timer - t
' 因为 buff 太长, 导致用 For .... Loop 太慢
End Sub