' 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 байт, возвращаеться указатель на эту память, далее в апишную функцию передаеться указатель на буфер и считываеться туда данные. Интересно, быстрее будет это работать чем стандартные динамические массивы и в чем раздница???
Во-первых, 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 ?
Файлы у меня размерами от 500 до 1500 метров!!! Так что скорость чтения очень важна! А что такое memory-mapping ? Я достаточно недавно пишу на нетовкой студии и для меня весь Framework еще темный лес!!
Можно ли средсвами бейсика получить доступ к памяти по физическому адресу или получить адрес переменной??
Доступ к памяти или получения адреса - в VB всё через Marshal.
Насколько я знаю, указатели на уровне языка поддерживает C#.
Memory-Mapping - работа с файлом как с областью памяти.
Я был уверен, что в .Net framework есть готовые классы, но похоже, что нет. В API mapping делается через функции API CreateFileMapping и MapViewOfFileEx. Подробнее можешь посмотреть в MSDN.
К сожалению, и Buffer.BlockCopy, и Marshal.Copy реализованы в native виде внутри mscorlib. Так просто не сказать, кто быстрее, нужно тестировать (а лень).
IMHO Marshal должен обгонять, т.к. он не делает лишних проверок. Но если кто-нибудь протестирует оба варианта - запостите результаты сюда, это должно быть интересно. Ещё можно протестировать просто Array.Copy.
>Можно ли средсвами бейсика получить доступ к памяти по физическому
адресу >или получить адрес переменной??
Какой смысл, если после каждого вызова GC адреса меняются?
Лучше создай класс-обертку и работай с ссылкой.