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

Нативный CopyMemory

24.09.2023, 11:14. Показов 8464. Ответов 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
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,506
Записей в блоге: 1
03.10.2023, 18:18  [ТС]
HackerVlad, я не знаю. Надо проверять на x64 Excel на него рассчет, для этого надо код еще подстроить по него, все что связано с указателями перевести в LongPtr. Но я переписал эту функцию (точнее процедуру, которая с LSet) кнкретно под VB с использованием GetMem4, закину в товю тему.
0
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,506
Записей в блоге: 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
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,506
Записей в блоге: 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
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,506
Записей в блоге: 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
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,506
Записей в блоге: 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
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,506
Записей в блоге: 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
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,506
Записей в блоге: 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
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,506
Записей в блоге: 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
1381 / 837 / 89
Регистрация: 08.02.2017
Сообщений: 3,506
Записей в блоге: 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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru