Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Еще раз про указатели и память! Добавлено: 23.04.04 07:45  

Автор вопроса:  sania-tngf

' Dim mpointer As IntPtr = Marshal.AllocHGlobal(100)

' Dim hr = New HandleRef(fs, fs.Handle)

' Dim mass(100) As Byte

'Dim bool As Boolean

'bool = ReadFile(hr, mpointer, 100, num_read, 0)

' For i = 0 To 99

' mass(i) = Marshal.ReadByte(mp, i)

'Next i

Написал такой код! Выделяеться память в 100 байт, возвращаеться указатель на эту память, далее в апишную функцию передаеться указатель на буфер и считываеться туда данные. Интересно, быстрее будет это работать чем стандартные динамические массивы и в чем раздница???

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 Андрей Щёкин [darxeth]



ICQ: 161560107 

Вопросов: 9
Ответов: 52
 Web-сайт: www.livejournal.com/users/darxeth_digital
 Профиль | | #1
Добавлено: 23.04.04 20:24

Во-первых, Marshal.ReadByte убьёт любую оптимизацию в корне. 100 вызовов функции однозначно меделеннее 100 обращений к массиву. И, кроме этого, "mass(i) = .." - это 100 проверок того, что элемент с индексом i действительно принадлежит массиву mass.

Для таких целей стоит использовать Marshal.Copy.

Кроме того mass(100) и есть стандартный динамический массив ;), т.к.

Dim mass(100) As Byte <=> Dim mass() As Byte = New Byte(101) {}

Но в принципе это должно работать быстрее встроенных классов (если использовать Marshal.Copy или сразу передавать ссылку на массив в процедуру). Я посмотрел Reflector'ом, в FileStream из BCL достаточно много всевозможных проверок и вложенных вызовов.

А какого размера весь файл ? Может быть, тут лучше будет сделать memory-mapping ?

Ответить

Номер ответа: 2
Автор ответа:
 sania-tngf



Вопросов: 16
Ответов: 21
 Профиль | | #2 Добавлено: 24.04.04 13:22

Файлы у меня размерами от 500 до 1500 метров!!! Так что скорость чтения очень важна! А что такое memory-mapping ? Я достаточно недавно пишу на нетовкой студии и для меня весь Framework еще темный лес!!

 Можно ли средсвами бейсика получить доступ к памяти по физическому адресу или получить адрес переменной??

Ответить

Номер ответа: 3
Автор ответа:
 Андрей Щёкин [darxeth]



ICQ: 161560107 

Вопросов: 9
Ответов: 52
 Web-сайт: www.livejournal.com/users/darxeth_digital
 Профиль | | #3
Добавлено: 26.04.04 01:58

Доступ к памяти или получения адреса - в VB всё через Marshal.

Насколько я знаю, указатели на уровне языка поддерживает C#.

Memory-Mapping - работа с файлом как с областью памяти.

Я был уверен, что в .Net framework есть готовые классы, но похоже, что нет. В API mapping делается через функции API CreateFileMapping и MapViewOfFileEx. Подробнее можешь посмотреть в MSDN.

Ответить

Номер ответа: 4
Автор ответа:
 Maxik



Вопросов: 58
Ответов: 201
 Профиль | | #4 Добавлено: 26.04.04 04:31
Кстати, в .net есть класс buffer, который ускоряет работу с массивом.

Ответить

Номер ответа: 5
Автор ответа:
 Андрей Щёкин [darxeth]



ICQ: 161560107 

Вопросов: 9
Ответов: 52
 Web-сайт: www.livejournal.com/users/darxeth_digital
 Профиль | | #5
Добавлено: 26.04.04 23:19

Очень полезный класс, полностью согласен.

К сожалению, и Buffer.BlockCopy, и Marshal.Copy реализованы в native виде внутри mscorlib. Так просто не сказать, кто быстрее, нужно тестировать (а лень).

IMHO Marshal должен обгонять, т.к. он не делает лишних проверок. Но если кто-нибудь протестирует оба варианта - запостите результаты сюда, это должно быть интересно. Ещё можно протестировать просто Array.Copy.

Ответить

Номер ответа: 6
Автор ответа:
 Maxik



Вопросов: 58
Ответов: 201
 Профиль | | #6 Добавлено: 27.04.04 08:49
>Можно ли средсвами бейсика получить доступ к памяти по физическому
адресу >или получить адрес переменной??
Какой смысл, если после каждого вызова GC адреса меняются?
Лучше создай класс-обертку и работай с ссылкой.


Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам