Как с указателями на область памяти работать?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Как с указателями на область памяти работать?

Сообщение Doctor Nestor » 09.04.2004 (Пт) 12:27

Предыстория:
Сижу пишу прогу на VB, ну классика:
...
for i=1 to ...
for j=1 to ...
...=...+array(i,j)
next
next
...
тормозит...
Подходит сишник, крутит пальцем у виска, говорит разве так делают. Цитирую:
"Когда ты так обращаешься к массиву идёт многократное копирование элементов массива из памяти в стек, а можно найти в памяти первый элемент и от него читать остальные прямо из памяти, выигрыш в 5 раз"

Народ, обращаюсь ко всем. Кто знает, как работать с указателями, поделитесь опытом или подкиньте ссылки. Вообще интересно услышать любые коментарии по теме.
Заранее благодарен.

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 09.04.2004 (Пт) 12:37

тут где-то неподалеку топик про SAFEARRAY так ты туда загляни... правда там какие-то неприятности при работе под NT, но думаю ребята разберутся :)
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 09.04.2004 (Пт) 12:44

Cyrax
благодарю за ссылку, разбираюсь...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.04.2004 (Пт) 12:57

Doctor Nestor, а ты покрути пальцем у виска сишнику и скажи "где VB, а где C" :)
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.04.2004 (Пт) 12:59

Кстати, где-то еще я видел рекомендации Microsoft относительно массивов. ЕМНИП, он размещаются в памяти согласно их измерениям (т.е. в твоем случае по столбцам), и если ты поменяешь местами i и j, то работать будет быстрее.
Lasciate ogni speranza, voi ch'entrate.

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 09.04.2004 (Пт) 13:21

индексы менял, может выигрыш и есть, но не заметил, опрос затраченного времени через Timer, показывает примерно одну величину (довольно сильно флуктуирующую :) ), Хоца выигрыш в 5 раз :) .
Noname - это самый популярный брэнд.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.04.2004 (Сб) 8:32

Ребята разобрались :)
Только ещё непонятнее стало...

Что касается копирования массива в стек - это это всё клевета и наговоры... (*ppSAFEARRAY)->pvData+offset, так сишнику и скажи :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 10.04.2004 (Сб) 8:41

Короче говоря, фильтруя всё пройденное через мозг и вылавливая нужное для оптимизации приложения (во закрутил, а :D ) вроде думаю, что вместо заполнения массива типа:
Arr(i)=..., может быстрее будет получить указатель на первый элемент
через VarPtr, а потом через PutMem его забивать?
Попробую...
Noname - это самый популярный брэнд.

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 10.04.2004 (Сб) 13:13

Если получишь выйгрыш времени, сообщи плиз.

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 10.04.2004 (Сб) 14:55

Проверил. Никакого выигрыша, ещё больше тормозит :(
Прилагается исходник, может кто подскажет, как всё-таки ускорить
либо заполнение массива, либо в цикле вызов элементов...
Noname - это самый популярный брэнд.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.04.2004 (Вс) 6:13

Нет, не прилагается исходник! :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 12.04.2004 (Пн) 11:15

:)
Вложения
testVB.rar
(2.16 Кб) Скачиваний: 66
Noname - это самый популярный брэнд.

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 12.04.2004 (Пн) 11:16

Прилагается уже :oops:
Noname - это самый популярный брэнд.

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 12.04.2004 (Пн) 11:53

ТОРМОЗА, жуткие тормоза
и PutMem и CopyMemory медленее простого
arr(i)=...
кошмар, как оптимизировать?
Noname - это самый популярный брэнд.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 12.04.2004 (Пн) 12:44

Можно посоветовать добавить такой фрагмент, взяв функцию PutMem8
Код: Выделить всё
Private Declare Function PutMem8 Lib "msvbvm60" (ByVal ptrToQWORDDest As Long, ByVal NewValueLowDWORD As Long, ByVal NewValueHighDWORD As Long) As Long

Код: Выделить всё
  T = Timer
  For i = 1 To 300000 Step 2
    PutMem8 PointerVar, i + 3, i + 4
    PointerVar = PointerVar + 8
  Next
  T = Timer - T
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Doctor Nestor
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 79
Зарегистрирован: 09.04.2004 (Пт) 12:02
Откуда: R-n-D

Сообщение Doctor Nestor » 12.04.2004 (Пн) 13:21

Vi
благодарю за совет, это действительно быстрее!!! (хоть и не намного)
Noname - это самый популярный брэнд.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 12.04.2004 (Пн) 16:30

Ты бы прикинул, сколько у тебя там всего сложений... Ну и примерные размерности неплохо было бы. Да и прим. мощность тачки не помешает. А то еще выяснится, что при таких объемах лучшая оптимизация - написание библы на асме и передача в нее указателя на весь твой массив... Ты не представляешь, _сколько_ тактов CPU на VB занимает A+B - порядка 70!..


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

    TopList