задача: вернуть числовой код, уникальный для любого 3х-буквенного сочетания(точнее от 1 до 3х букв)
мое первоначальное решение:
Function getncomb(sr$) As Long
getncomb = CLng(Asc(Mid(LCase(sr), 1, 1)) - 223) * 10000
If Len(sr) > 1 Then
getncomb = getncomb + (Asc(Mid(LCase(sr), 2, 1)) - 223) * 100
If Len(sr) > 2 Then getncomb = getncomb + Asc(Mid(LCase(sr), 3, 1)) - 223
End If
End Function
вот текущее решение - работает в 4 раза быстрее:
Private Declare Sub GetMem8 Lib "msvbvm60.dll" (ByVal SrcPointer As Long, ByVal DstPointer As Long)
Function getncomb(sr$) As Long
Dim r(0 To 99) As Integer
Call GetMem8(StrPtr(sr), VarPtr(r(0)))
getncomb = r(0) - 1071
If Len(sr) > 1 Then
getncomb = getncomb + (r(1) - 1071) * 33
If Len(sr) > 2 Then getncomb = getncomb + (r(2) - 1071) * 1089
End If
End Function
собственно вопрос - будет ли быстрее, если не переписывать память(в данном случае нужно всего лишь 6 байт, но приходится брать 8), а подменить указатели, чтобы массив r ссылался на данные строки sr ?
мое первоначальное решение:
Function getncomb(sr$) As Long
getncomb = CLng(Asc(Mid(LCase(sr), 1, 1)) - 223) * 10000
If Len(sr) > 1 Then
getncomb = getncomb + (Asc(Mid(LCase(sr), 2, 1)) - 223) * 100
If Len(sr) > 2 Then getncomb = getncomb + Asc(Mid(LCase(sr), 3, 1)) - 223
End If
End Function
вот текущее решение - работает в 4 раза быстрее:
Private Declare Sub GetMem8 Lib "msvbvm60.dll" (ByVal SrcPointer As Long, ByVal DstPointer As Long)
Function getncomb(sr$) As Long
Dim r(0 To 99) As Integer
Call GetMem8(StrPtr(sr), VarPtr(r(0)))
getncomb = r(0) - 1071
If Len(sr) > 1 Then
getncomb = getncomb + (r(1) - 1071) * 33
If Len(sr) > 2 Then getncomb = getncomb + (r(2) - 1071) * 1089
End If
End Function
собственно вопрос - будет ли быстрее, если не переписывать память(в данном случае нужно всего лишь 6 байт, но приходится брать 8), а подменить указатели, чтобы массив r ссылался на данные строки sr ?
Живи и дай жить..