Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перемещение участков памяти

1.5K
14 апреля 2004 года
shtutsa
50 / / 27.03.2003
Пытаюсь ускорить обмен строк двумерного массива, но результат совсем не оправдывает ожидания. В чем я ошибся? Как организованы двумерные массивы VBA в памяти машины?
Программа должна скопировать строку 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
258
14 апреля 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by shtutsa

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()

1.5K
14 апреля 2004 года
shtutsa
50 / / 27.03.2003
Цитата:
Originally posted by SergeySV


Тебя не устраивает выполнение именно этого куска кода, ну и скоко же оно выполняется?..... ИМХО настоящим тормозом должен выступать следующий кусок кода, с обращением к Cells()



имелось ввиду разница во времени между выполнением этого куска:
For j = 1 To P_Len
Pop(dest, j) = Pop(src, j)
Next

И вот этого:
MemCopy Pop(dest, 1), Pop(src, 1), P_Len * 4

Следующий кусок это просто вывод на экран для контроля результатов :-)

С организацией массивов в памяти я разобрался - последовательно идут элементы по столбцам (а не по строкам), поэтому мой код копирует элементы не строки, а часть массива, перечисляемую по солбцам.

Необходимо просто реорганизвать массив для применения операций копирования в памяти.

1.5K
14 апреля 2004 года
shtutsa
50 / / 27.03.2003
Сравни время выполнения этого кода
при 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
258
15 апреля 2004 года
SergeySV
1.5K / / 19.03.2003
Ой, а как сравнить? с первым вариантом функции test?, но первый отрабатывает быстрее чем второй, наверное разные границы массивов
1.5K
15 апреля 2004 года
shtutsa
50 / / 27.03.2003
Цитата:
Originally posted by SergeySV
Ой, а как сравнить? с первым вариантом функции test?, но первый отрабатывает быстрее чем второй, наверное разные границы массивов



Возьми вторую версию кода и запусти.
При cf=false/true алгоритм копирует одинаковое кол-во элементов, а вот время выполнения сокращается в 5 раз!
(во втором варианте кода использован дополнительный цикл на 100000 проходов, чтобы разница во времени была заметна и измеряема с высокой точностью)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог