Нативный CopyMemory24.09.2023, 11:14. Показов 8685. Ответов 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
|
||
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 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
|
||
|
Испарился
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
|
|
| 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 | |
|
Помогаю со студенческими работами здесь
80
CopyMemory жжет
memcpy/CopyMemory + 2-мерный динамический массив CreateFileMapping ошибка в CopyMemory Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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(), которая. . .
|