Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.00/2: Рейтинг темы: голосов - 2, средняя оценка - 4.00
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1

Нативный CopyMemory

24.09.2023, 11:14. Показов 8688. Ответов 122

Студворк — интернет-сервис помощи студентам
Натолкнуло на рассуждения, уже ранее упомянутое.. В общем то уже ранее слышал, про замедление работы апишных функций в современных реалиях. Собственно вопрос, возможно ли копирование блока/участка с динамически меняющимся (настраиваемым) значением(?). Собственно копирование то возможно блоков разного размера, есл говорить о больших - замапив на оба блока массивы и выполнив присвоения в цикле с одного массива в другой. Тесты показывают, что блок одинакового размера копируется в 4 раза быстрей с помощью массива long, нежели битового и также в других случаях - чем меньше итераций, тем кратно быстрей. Можно копировать и большие блоки за одну операцию средствами VB. Если создать тип, с фиксированным массивом внутри, то один экземпляр типа (фактически массив) можно присвоить другому экземпляру типа. С динамическими массивами так не получится, блок перезаписывается, также как и у строк. С другой стороны у фиксированого массива свои недостатки, его нельзя замапить изменить его заголовочную структуру и даже поменять указатель на нее

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Public Type tpArr
    arr(1000) As Integer
End Type
 
Sub ffsff
    Dim ta1 As tpArr, ta2 As tpArr
    
    Debug.Print VarPtr(ta1.arr(0))
    ta1 = ta2
    Debug.Print VarPtr(ta1.arr(0))  
End Sub
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.09.2023, 11:14
Ответы с готовыми решениями:

Private Declare Sub CopyMemory Lib 'kernel32' Alias 'RtlMoveMemory' (Destination As Any, Source As Any, ByVal Length As Long)
В QBasic можно написать: DEF SEG=&H40 PRINT PEEK(&H100) 'ЧИТАЕМ БАЙТ В ОПЕРАТИВКЕ ПО АДРЕСУ...

В WinXP не работает API процедура CopyMemory. Что делать?
В WinXP не работает API процедура CopyMemory. Что делать? Public Declare Sub CopyMemory Lib...

Почему указатель нулевой при CopyMemory
Здрасть. Функция CopyMemory говорит что указатель is 0. Как исправить? *Old = AllocateMemory(1)...

122
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.10.2023, 17:53
Студворк — интернет-сервис помощи студентам
testuser2, и что твоя функция быстрее, чем CopyMemory?
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
03.10.2023, 18:18  [ТС]
HackerVlad, я не знаю. Надо проверять на x64 Excel на него рассчет, для этого надо код еще подстроить по него, все что связано с указателями перевести в LongPtr. Но я переписал эту функцию (точнее процедуру, которая с LSet) кнкретно под VB с использованием GetMem4, закину в товю тему.
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
04.10.2023, 02:40  [ТС]
Добавил в тест новые функции (отсюа и отсюда), замерил скорость. Инструкция по использованию теста: раскомментируйте две строки с нужным копировальщиком в цикле.
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Option Explicit
 
Private Const Size = 3072 '1024 'размер копируемого/зануляемого буфера
'Private Const hSz = Size \ 2
 
Private Type byteArray
    arr(Size - 1) As Byte
End Type
Private Type fixArray
'    arr(Size - 1) As Byte
    arr(Size \ 2 - 1) As Integer
'    arr(Size \ 4 - 1) As Long
'    arr(Size \ 8 - 1) As Currency
End Type
 
Sub testCopySpeed()
'    Const sEmp As String * hSz = vbNullChar
    Dim i&, t!, sIn$, sOut$, sEmp$, nmFn$
    Dim pIn&, pOut&, pEmp&
    Dim byteArr As byteArray
    Dim fxArrIn  As fixArray
    Dim fxArrOut As fixArray
    Dim fxArrEmp As fixArray
    varInit 4 + 16
    varInitLs
    
    Randomize         'подготавливаем блок случайных данных
    For i = 0 To Size - 1
        byteArr.arr(i) = Rnd * 255
    Next
    
'    LSet fxArrOut = byteArr
    sOut = byteArr.arr
    sIn = String(Size \ 2, vbNullChar)
    sEmp = sIn
    
    t = Timer
    pIn = StrPtr(sIn): pOut = StrPtr(sOut): pEmp = StrPtr(sEmp)
    For i = 0 To 100000 '10000000
'        fxArrIn = fxArrOut    'копируем блок
'        fxArrIn = fxArrEmp    'зануляем блок
'        LSet sIn = sOut
'        LSet sIn = sEmp
'        Mid$(sIn, 1) = sOut
'        Mid$(sIn, 1) = sEmp
        CopyMemory ByVal StrPtr(sIn), ByVal StrPtr(sOut), Size
        CopyMemory ByVal StrPtr(sIn), ByVal StrPtr(sEmp), Size
'        CopyMemory ByVal pIn, ByVal pOut, Size
'        CopyMemory ByVal pIn, ByVal pEmp, Size
'        MemCopyLs2 StrPtr(sOut), StrPtr(sIn), Size
'        MemCopyLs2 StrPtr(sEmp), StrPtr(sIn), Size
'        MemCopyLs StrPtr(sOut), StrPtr(sIn), Size
'        MemCopyLs StrPtr(sEmp), StrPtr(sIn), Size
'        MemCopy16_ StrPtr(sOut), StrPtr(sIn), Size
'        MemCopy16_ StrPtr(sEmp), StrPtr(sIn), Size
    Next
    t = Timer - t
    Debug.Print t
    
    ReleaseAllPtrs
End Sub

Результаты (для копирования блока 3072 байта 100000 раз):
Code
1
2
3
4
5
Mid$        0,4
MemCopyLs   0,093
MemCopyLs2  0,1
CopyMemory  0,03125
MemCopy16_  2.94
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.10.2023, 09:33
testuser2, так зачем ты писал эти свои функции если они медленнее? по таблице результатов, я вижу, что CopyMemory на первом месте по скорости.

Добавлено через 1 минуту
Вообще не вижу в этом никакого смысла

Добавлено через 7 секунд
Потерянное время только зря

Добавлено через 1 минуту
То что один человек тебе там наврал что у него там CopyMemory было в 600 раз медленнее, забудь ты уже про это враньё

Добавлено через 28 секунд
CopyMemory не может быть медленным, это очень быстрая функция
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
04.10.2023, 12:23  [ТС]
HackerVlad, да медленные, но есть как минимум 2 интересные вещи, если приглядеться. Во-первых, быстрее Mid$. Во вторых, это близкая скорость MemCopyLs, MemCopyLs2. Если в MemCopyLs2 sIn и sOut задекларировать в модуле, и закомментировать последние две строчки, она становится по скорости абсолютно равной MemCopyLs. Как думаешь в чем заключается интересная вещь?
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.10.2023, 13:03
testuser2, ты меня конечно извини, но я всё равно буду использовать CopyMemory. И мне плевать, что у одного человека из ста миллионов человек, возможно будет тормозить эта функция из-за его дерьмового компьютера.
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
04.10.2023, 13:19  [ТС]
HackerVlad, если можно ответь на такой ворос. Чтобы копировать 4 байта, что лучше использовать CopyMemory или GetMem4?
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.10.2023, 16:49
GetMem4
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
04.10.2023, 17:56  [ТС]
Теперь представь, что есть способ который работает аналогично GetMem4, но без GetMem4.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
04.10.2023, 18:51
testuser2, мне не сложно воспользоваться функцией GetMem4

Добавлено через 24 секунды
Я не понимаю зачем тебе это всё надо
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
05.10.2023, 02:55  [ТС]
На vba нет GetMem в стоке. msvbvm60 есть не везде, для x64, ее нету вообще.
Кстати, сейчас доделал версию под vba x64 и там моя функция оказалась быстрее чем CopyMemory, прикол.
Code
1
2
3
4
2,228516 
2,222656 
0,9335938 
0,9355469
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
05.10.2023, 07:49
Цитата Сообщение от testuser2 Посмотреть сообщение
нет GetMem
Библиотека msvbvm60 есть почти на всех компьютерах, а значит и воспользоваться функцией GetMem4 просто раз плюнуть.

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
msvbvm60 есть не везде, для x64, ее нету вообще
кто тебе сказал такую ерунду вообще? У меня x64 и библиотека msvbvm60 была ещё до того как я поставил VB.

Добавлено через 30 секунд
Цитата Сообщение от testuser2 Посмотреть сообщение
в стоке
И вообще что такое сток?

Добавлено через 1 минуту
Вот кто тебе вбил в голову такую ерунду, что msvbvm60 есть не везде? У тебя вот эта библиотека есть? Есть! Была? Была! У 99% людей есть библиотека msvbvm60.

Добавлено через 26 секунд
Отписываюсь от темы короче.
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
05.10.2023, 07:57  [ТС]
Еще из наблюдений. Для 64-битной kernel32 доступна функция RtlCopyMemory, наряду с RtlMoveMemory, однако ни какой разницы в скорости в своем тесте я не заметил. Также когда-то видел совет, что декларирование функций по номеру (ординалу) усоряет вызов. На vba x64 это только замедляет в 5 раз, причем эти ординалы, для одних и тех же функций разные на разных битностях.
Цитата Сообщение от HackerVlad Посмотреть сообщение
Библиотека msvbvm60 есть почти на всех компьютерах
Сам не могу ни чего сказать, но пишут, что сейчас уже далеко не везде.

Добавлено через 2 минуты
Цитата Сообщение от HackerVlad Посмотреть сообщение
Вот кто тебе вбил в голову такую ерунду, что msvbvm60 есть не везде?
Я вот у себя свою прогу хотел запустить на другом компе под Win10, она зупустилась, но не работала, просто окно. Заработала, когда я закинул библиотеку.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
05.10.2023, 11:58
Цитата Сообщение от testuser2 Посмотреть сообщение
под Win10
На всех десятках есть эта библиотека, кроме урезанных сборок каких-то неофициальных, где специально много чего повыкидывали "лишнего"

Добавлено через 1 минуту
msvbvm60.dll входит в состав Windows официально, начиная с Windows Me. Это в Windows 98 надо было тягать за собой эту библиотеку...
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
05.10.2023, 14:57  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Еще из наблюдений.
Ни когда не замечал особой разницы в исполнении функций, задекларированных с параметрами ByVal или ByRef, на 32битном vba, но вот x64 разница видимо есть. В моем случае, указав у своей процедуры MemCopyLs параметры на ByVal, скорость выросла на 14%.

Добавлено через 49 минут
В общем конкретные цифры у меня
Code
1
2
3
4
5
6
x86 Office:
CopyMemory 0,265625
MemCopyLs  0,75
x64 Office:
CopyMemory 2,171875
MemCopyLs  0,75
В данном случае в x64 vba CopyMemory в 8 медленне чем на x86. В то же время моя функция в первом случае оказывается в 2,82 раз медленей API, но во втором случае в 2,9 раза быстрей. Такой интересный расклад.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
05.10.2023, 18:19
Цитата Сообщение от testuser2 Посмотреть сообщение
не замечал особой разницы в исполнении функций, задекларированных с параметрами ByVal или ByRef
ты смеёшься? разница огромная

Добавлено через 54 секунды
стоит только ошибиться и программа не будет работать. ByVal и ByRef это большая разница.
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
05.10.2023, 18:28  [ТС]
HackerVlad, спасибо, что не забываешь про тему ) Я имел в виду скорость. Скорость вызова примерно не различается, если задать long by val или by ref. Но в 64битном vba немного другая физика работы, другой, размер указателей (8 байт), и место в стеке под указатели выделяется уже 8 байт, может как-то с этим связано. Там более заметно различие ByVal и ByRef в скорости
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
05.10.2023, 18:51
Цитата Сообщение от testuser2 Посмотреть сообщение
спасибо, что не забываешь про тему
да я уже давно на неё забил если честно

Добавлено через 42 секунды
уже давно пора закрывать эту тему
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
05.10.2023, 18:56
Цитата Сообщение от HackerVlad Посмотреть сообщение
кто тебе сказал такую ерунду вообще? У меня x64 и библиотека msvbvm60 была ещё до того как я поставил VB.
Ну и как ты собрался из 64 битного офиса использовать 32 битную GetMem4 из msvbvm60?
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
05.10.2023, 19:08
The trick, нельзя разве? да мне пофиг на vba если честно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.10.2023, 19:08
Помогаю со студенческими работами здесь

CopyMemory жжет
#If Win64 Then Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"...

CopyMemory ?
Как использовать CopyMemory в алгоритмах сортировки с различными типами данных ??? Пытался...

Реализовать нативную функцию дв.в.восьм
Доброго времени суток. Собственно по тз требуется реализовать нативную функцию Excel дв.в.восьм...

memcpy/CopyMemory + 2-мерный динамический массив
Третий день в ступоре из-за ругательства компилятора. Есть проблема: нужно скопировать данные из...

CreateFileMapping ошибка в CopyMemory
Жалуестя на 1>c:\users\сергей\documents\visual studio 2010\projects\lab2\lab2\lab2.cpp(45): error...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru