Нативный CopyMemory24.09.2023, 11:14. Показов 11580. Ответов 122
Метки рассуждения (Все метки)
Натолкнуло на рассуждения, уже ранее упомянутое.. В общем то уже ранее слышал, про замедление работы апишных функций в современных реалиях. Собственно вопрос, возможно ли копирование блока/участка с динамически меняющимся (настраиваемым) значением(?). Собственно копирование то возможно блоков разного размера, есл говорить о больших - замапив на оба блока массивы и выполнив присвоения в цикле с одного массива в другой. Тесты показывают, что блок одинакового размера копируется в 4 раза быстрей с помощью массива long, нежели битового и также в других случаях - чем меньше итераций, тем кратно быстрей. Можно копировать и большие блоки за одну операцию средствами VB. Если создать тип, с фиксированным массивом внутри, то один экземпляр типа (фактически массив) можно присвоить другому экземпляру типа. С динамическими массивами так не получится, блок перезаписывается, также как и у строк. С другой стороны у фиксированого массива свои недостатки, его нельзя замапить изменить его заголовочную структуру и даже поменять указатель на нее
0
|
||||||
| 24.09.2023, 11:14 | |
|
Ответы с готовыми решениями:
122
Private Declare Sub CopyMemory Lib 'kernel32' Alias 'RtlMoveMemory' (Destination As Any, Source As Any, ByVal Length As Long) В WinXP не работает API процедура CopyMemory. Что делать? Почему указатель нулевой при CopyMemory |
| 05.10.2023, 19:56 [ТС] | |
|
Замер с моего ноутбука (Win8.1), с автокадного 64битного vba. CM в 1,8 раз медленней
1.594971/0.8798828 1,81270846526378 Добавлено через 1 минуту Прямое присвоение там 0,3320313 при прочих равных
0
|
|
| 07.10.2023, 10:29 [ТС] | ||||||
|
Глядя на код VBA Memory Tools, видно, что там довольно профессиональный досканально-скурпулезный подход, очнь много тестов, подчас многое не понятно. Понравились мне там конструкции типа MemByte(VarPtr(x1)) = MemByte(VarPtr(x2)). В данном случае это комбинация из парных свойств Property Let, и Property Get, и появилась идея поразбираться, как это работает. Кртакий вывод работает не очень хорошо если дело касается данных (строки, массивы) и именно это является одной из причин (возможно основной) медлительности левого Mid-а, который работает по такому же принципу, зашитому в VB. В чем подвох. В выражении
0
|
||||||
| 20.11.2023, 10:17 | |
|
HackerVlad, только ситхи всё возводят в абсолют
![]() Когда человек говорит так однозначно и бескомпромиссно, как вы, да ещё, к тому же без доказательной базы, лично для меня это говорит тольео о том, что у вас очень маленький опыт тестирования, или же вы не делаете выводов, или же тесты нельзя назвать полными. testuser2, приветствую! Судя оп тестам, получается обычная ситуация — нет универсального варианта, и, для достижения максимальной скорости, нужно уметь комбинировать приёмы в зависимости от ситуации. Поняло не всё, но пример с Mid'ом заинтересовал — ведь метод вставки с помощью него считается (и совершенно правильно) наибыстрейшим на VBA. За темой послежу, желаю успехов в исследованиях. Если будет что сказать — скажу
0
|
|
|
Модератор
|
|
| 20.11.2023, 10:23 | |
|
Самый оптимальный и почти самый быстрый вариант - RtlMoveMemory (aka CopyMemory). Всё остальное -это микрооптимизации которые лишь в некоторых случаях могут повысить производительность.
2
|
|
| 20.11.2023, 10:47 | |
|
The trick, полагаю, его можно считать универсальным, а также самым быстрым, но с оговоркой "если мы не хотим заморачиваться, считая биты и тому подобное".
Так получается?
0
|
|
| 20.11.2023, 11:34 [ТС] | ||
|
Добавлено через 17 минут Jack Famous, обобщенно резюмируя по теме могу сказать, что мелкие операции копировния стандартных типов (long, integer и т.д.), можно осуществлять очень быстро, благодаря манипуляций с указателями, описаными уважаемым The trick-ом.
1
|
||
| 20.11.2023, 11:39 | |
|
testuser2, нужны примеры практического применения в сравнении со штатными способами — например, вот тут, смотрите, будет быстрее, чем Mid() = , а вот тут обнуление массива быстрее, чем ReDim динамического или Erase статического.
0
|
|
| 20.11.2023, 12:08 [ТС] | |||
|
Добавлено через 7 минут
1
|
|||
| 20.11.2023, 12:19 | ||
|
testuser2, я вас умоляю) орды халявщиков просто не осиливают не то, что работу с указателями, а даже темы с готовыми решениями)))
0
|
||
|
Модератор
|
||
| 20.11.2023, 12:41 | ||
0
|
||
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
|
| 20.11.2023, 12:55 | |
|
Jack Famous, я если честно вообще не понял, за что ты меня обосрал
Добавлено через 2 минуты testuser2, спасибо большое) приятно слышать хорошие отзывы)
0
|
|
| 20.11.2023, 13:01 [ТС] | ||||||
|
The trick, в модуле TestArrayCopySpeed процедура testCopySpeed, там две строчки
Расширение zip надо убрать
0
|
||||||
| 20.11.2023, 13:20 [ТС] | ||||||
|
Jack Famous, давай на ты, тут все на ты , и я на сколько знаю, ты общаешься на с Щербаковым и Виталием Бедным, так что мне тем более не резон )
Не по теме: И обоюдно хотел бы всех попросить не устраивать лишнего срача Добавлено через 9 минут The trick, там в тесте есть ошибка (сейчс обнаружил), я последний раз когда редактировал поменял положение параметров Dst и Src, сделал как у CopyMemory. Должно быть так.
0
|
||||||
| 20.11.2023, 13:24 | ||
|
testuser2, ну раз принято, ок. С ними общаюсь, потому что давно знакомы.
0
|
||
|
Вернулся
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
|
|
| 20.11.2023, 13:47 | |
|
Мир и дружба)))
2
|
|
|
Модератор
|
|
| 21.11.2023, 19:13 | |
Сообщение было отмечено testuser2 как решение
Решение
Короче посмотрел я в чем дело. В общем в VBE7 по какой-то причине при вызове Declared функции всегда вызывается DllFunctionCall, которая каждый раз вызывает LoadLibrary/GetProcAddress пару. Почему так сделали - мне неизвестно. В VBA6/VB6 - адрес сохраняется. Прикол в том что там есть ассемблерные чанки которые такие же как и в VBA6/VB6 (NativeDeclareProlog/NativeDeclareCall/NativeDeclareEpilog), но на них в коде VBE7 нет ни одной ссылки. Вместо этого вызывается последовательность DeclareProlog/DeclareCall/DeclareEpilog в которой вызывается DllFunctionCall которая многократно замедляет любую API функцию:
К счастью есть TlbCall который не вызывает ничего лишнего, так что объявив RtlMoveMemory в tlb код будет исполняться намного-намного быстрее. Насчет самой RtlMoveMemory - там все сделано очень быстро, и ничего там тормозить не должно. Я еще поковыряю, мб как-то через Declare получится сделать через NativeDeclareEpilog. Можно кстати просто перезаписать динамические чанки и напрямую вызывать нужную функцию - нужно только глянуть какой импорт у VBE7 И есть ли доступ к ним.
5
|
|
| 21.11.2023, 22:20 [ТС] | |||||||||
|
Тут уж, как говориться, "маэстро взялся за дело"! Серьезная информация поступила )
1
|
|||||||||
| 21.11.2023, 22:20 | |
|
CopyMemory жжет
memcpy/CopyMemory + 2-мерный динамический массив CreateFileMapping ошибка в CopyMemory Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки.
Добавлено:
- Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
|
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы.
Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|