Option ExplicitPrivate Const SortString As String = "5589E5608B75088B7D0C4F31C98B048E89CA428B1C9639D87C08891C8E89049689D839FA75EC4139F97CE261C9C21000"
Private Const SortLength As Long = 48Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
Private Const GMEM_FIXED = &H0
Private Const GMEM_ZEROINIT = &H40
Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)Private SortMemory As LongPrivate Sub Class_Initialize()
Dim X As Long, Y As Long
ReDim Buffer(1 To SortLength) As Byte
X = 1
Do While Y < SortLength
Y = Y + 1
Buffer(Y) = Val("&H" & Mid(SortString, X, 2))
X = X + 2
Loop
SortMemory = GlobalAlloc(GPTR, SortLength)
CopyMemory ByVal SortMemory, Buffer(1), SortLength
End SubPrivate Sub Class_Terminate()
GlobalFree SortMemory
End SubPublic Function BubbleSort(Data() As Long) As Boolean
Dim Length As Long
Length = UBound(Data) - LBound(Data) + 1
CallWindowProc SortMemory, VarPtr(Data(LBound(Data))), Length, 0, 0
End Function
在网络上淘的,共享给大家。
简单的几行代码,比VB本土的冒泡排序效率高了很多倍,崇拜中。
Private Const SortLength As Long = 48Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
Private Const GMEM_FIXED = &H0
Private Const GMEM_ZEROINIT = &H40
Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)Private SortMemory As LongPrivate Sub Class_Initialize()
Dim X As Long, Y As Long
ReDim Buffer(1 To SortLength) As Byte
X = 1
Do While Y < SortLength
Y = Y + 1
Buffer(Y) = Val("&H" & Mid(SortString, X, 2))
X = X + 2
Loop
SortMemory = GlobalAlloc(GPTR, SortLength)
CopyMemory ByVal SortMemory, Buffer(1), SortLength
End SubPrivate Sub Class_Terminate()
GlobalFree SortMemory
End SubPublic Function BubbleSort(Data() As Long) As Boolean
Dim Length As Long
Length = UBound(Data) - LBound(Data) + 1
CallWindowProc SortMemory, VarPtr(Data(LBound(Data))), Length, 0, 0
End Function
在网络上淘的,共享给大家。
简单的几行代码,比VB本土的冒泡排序效率高了很多倍,崇拜中。
·先把要排序的数据写到一个临时的文本文件
·Shell调用C语言写的qsort.exe
·qsort.exe是用C语言写的从临时文本文件读入数据,调用qsort函数排序,将排好序的数据写入另一个文本文件
·VB从结果文本文件中读入排序结果
的速度快。
push ebp
seg000:00000001 mov ebp, esp
seg000:00000003 pusha
seg000:00000004 mov esi, [ebp+arg_0]
seg000:00000007 mov edi, [ebp+arg_4]
seg000:0000000A dec edi
seg000:0000000B xor ecx, ecx
seg000:0000000D
seg000:0000000D loc_D: ; CODE XREF: sub_0+29j
seg000:0000000D mov eax, [esi+ecx*4]
seg000:00000010 mov edx, ecx
seg000:00000012
seg000:00000012 loc_12: ; CODE XREF: sub_0+24j
seg000:00000012 inc edx
seg000:00000013 mov ebx, [esi+edx*4]
seg000:00000016 cmp eax, ebx
seg000:00000018再反成C的。
__int64 __fastcall sub_0(__int64 a1, int a2, int a3, int a4, int a5, int a6, int a7)
{
int v5; // ecx@1
int v6; // edi@1
int v7; // esi@1
__int64 v8; // ST00_8@1
int v9; // eax@2
int v10; // edx@2
int v11; // ebx@3 v8 = a1;
v7 = a4;
v6 = a5 - 1;
v5 = 0;
do
{
v9 = *(_DWORD *)(v7 + 4 * v5);
v10 = v5;
do
{
++v10;
v11 = *(_DWORD *)(v7 + 4 * v10);
if ( v9 >= v11 )
{
*(_DWORD *)(v7 + 4 * v5) = v11;
*(_DWORD *)(v7 + 4 * v10) = v9;
v9 = v11;
}
}
while ( v10 != v6 );
++v5;
}
while ( v5 < v6 );
return v8;
}
seg000:00000000 push ebp
seg000:00000001 mov ebp, esp
seg000:00000003 pusha
seg000:00000004 mov esi, [ebp+arg_0]
seg000:00000007 mov edi, [ebp+arg_4]
seg000:0000000A dec edi
seg000:0000000B xor ecx, ecx
seg000:0000000D
seg000:0000000D loc_D: ; CODE XREF: sub_0+29j
seg000:0000000D mov eax, [esi+ecx*4]
seg000:00000010 mov edx, ecx
seg000:00000012
seg000:00000012 loc_12: ; CODE XREF: sub_0+24j
seg000:00000012 inc edx
seg000:00000013 mov ebx, [esi+edx*4]
seg000:00000016 cmp eax, ebx
seg000:00000018 jl short loc_22
seg000:0000001A mov [esi+ecx*4], ebx
seg000:0000001D mov [esi+edx*4], eax
seg000:00000020 mov eax, ebx
seg000:00000022
seg000:00000022 loc_22: ; CODE XREF: seg000:00000018j
seg000:00000022 cmp edx, edi
seg000:00000024 jnz short loc_12
seg000:00000026 inc ecx
seg000:00000027 cmp ecx, edi
seg000:00000029 jl short loc_D
seg000:0000002B popa
seg000:0000002C leave
seg000:0000002D retn 10h