Перемещение участков памяти
Программа должна скопировать строку 2 на место строки 1, т.е. cf=true/false, должен давать одинаковые результаты, кроме времени выполенения программы.
Мой код:
Option Explicit
Declare Sub MemCopy Lib "Kernel32" Alias _
"RtlMoveMemory" (dest As Any, src As Any, _
ByVal numbytes As Long)
Public Pop() As Single
Sub test()
Const P_Len As Integer = 256
Dim i As Integer, j As Integer, dest As Integer, src As Integer
ReDim Pop(1 To 9, 1 To P_Len) As Single
Dim cf As Boolean
For i = 1 To 9
For j = 1 To P_Len
Pop(i, j) = i * 100 + j
Next
Next
' cf = True
dest = 1
src = 2
If cf Then
For j = 1 To P_Len
Pop(dest, j) = Pop(src, j)
Next
Else
MemCopy Pop(dest, 1), Pop(src, 1), P_Len * 4
End If
For i = 1 To 9
For j = 1 To P_Len
Cells(i, j) = Pop(i, j)
Next
Next
End Sub
If cf Then
For j = 1 To P_Len
Pop(dest, j) = Pop(src, j)
Next
Else
MemCopy Pop(dest, 1), Pop(src, 1), P_Len * 4
End If
Тебя не устраивает выполнение именно этого куска кода, ну и скоко же оно выполняется?..... ИМХО настоящим тормозом должен выступать следующий кусок кода, с обращением к Cells()
Тебя не устраивает выполнение именно этого куска кода, ну и скоко же оно выполняется?..... ИМХО настоящим тормозом должен выступать следующий кусок кода, с обращением к Cells()
имелось ввиду разница во времени между выполнением этого куска:
For j = 1 To P_Len
Pop(dest, j) = Pop(src, j)
Next
И вот этого:
MemCopy Pop(dest, 1), Pop(src, 1), P_Len * 4
Следующий кусок это просто вывод на экран для контроля результатов :-)
С организацией массивов в памяти я разобрался - последовательно идут элементы по столбцам (а не по строкам), поэтому мой код копирует элементы не строки, а часть массива, перечисляемую по солбцам.
Необходимо просто реорганизвать массив для применения операций копирования в памяти.
при cf=true и cf=false :-)
Option Explicit
Declare Sub MemCopy Lib "Kernel32" Alias _
"RtlMoveMemory" (dest As Any, src As Any, _
ByVal numbytes As Long)
Public Pop() As Single
Sub test()
Const P_Len As Integer = 256
Dim i As Integer, j As Integer, dest As Integer, src As Integer
Dim k As Long
ReDim Pop(1 To 9, 1 To P_Len) As Single
Dim cf As Boolean
For i = 1 To 9
For j = 1 To P_Len
Pop(i, j) = i * 100 + j
Next
Next
cf = True
dest = 1
src = 2
MyTimer (0)
For k = 1 To 100000
If cf Then
For j = 1 To P_Len
Pop(dest, j) = Pop(src, j)
Next
Else
MemCopy Pop(dest, 1), Pop(src, 1), 4 * P_Len
End If
Next k
MyTimer (2)
For i = 1 To 9
For j = 1 To P_Len
Cells(i, j) = Pop(i, j)
Next
Next
End Sub
Public Function MyTimer(v As Integer) As Single
Static tStart!
Dim tTotal!
Select Case v
Case 0: tStart = Timer: MyTimer = 0
Case 1: tTotal = Timer - tStart: MyTimer = tTotal
Case Else: tTotal = Timer - tStart: MsgBox CStr(tTotal) & "s": MyTimer = tTotal
End Select
End Function
Ой, а как сравнить? с первым вариантом функции test?, но первый отрабатывает быстрее чем второй, наверное разные границы массивов
Возьми вторую версию кода и запусти.
При cf=false/true алгоритм копирует одинаковое кол-во элементов, а вот время выполнения сокращается в 5 раз!
(во втором варианте кода использован дополнительный цикл на 100000 проходов, чтобы разница во времени была заметна и измеряема с высокой точностью)