Нативный CopyMemory24.09.2023, 11:14. Показов 9278. Ответов 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
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,788
|
|
| 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
|
||
|
Вернулся
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,788
|
|
| 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|