Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840

Подскажите пожалуйста аналог функции RtlMoveMemory только быстрее

29.03.2023, 12:32. Показов 3471. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Мне часто приходится копировать память, в основном это строковые данные переменной длинны.
Всем известно, что функции GeMem 1-8 работают гораздо быстрее, чем CopyMemory. Но нет такой функции для переменной длины. Вы конечно, может будете смеяться, но я при копировании небольших строк переменной длины использую даже код такой:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Select Case LenBytesSearchString
                Case 1
                    GetMem1 ByVal pData2, ByVal StrPtrstrs
                    
                Case 2
                    GetMem2 ByVal pData2, ByVal StrPtrstrs
                    
                Case 4
                    GetMem4 ByVal pData2, ByVal StrPtrstrs
                    
                Case 8
                    GetMem8 ByVal pData2, ByVal StrPtrstrs
                    
                Case Else
                    RtlMoveMemory ByVal StrPtrstrs, ByVal pData2, LenBytesSearchString
            End Select
В зависимости от количества байтов копируемой строки вызывается та или инная функция)))) Не смейтесь только надо мной, через GetMem копируется на 30-40 миллисекунд быстрее. Так вот, а случайно нет функции для переменной длины, чтобы была такая же быстрая как и GetMem?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.03.2023, 12:32
Ответы с готовыми решениями:

алгоритм функции RtlMoveMemory Win32API n
DECLARE Integer RtlMoveMemory IN Win32API Double @Dst, String Src, Long n это функция распаковки данных кто знает алгоритм этой функции ...

Подскажите аналог функции SetConsoleCursorPosition
Подскажите аналог функции SetConsoleCursorPosition

Подскажите аналог функции StrCmpICA
Здравствуйте! Подскажите, пожалуйста, аналог функции StrCmpICA, мне нужно обязательно для ANSI строки. Просто эта функция не сравнивает...

49
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
30.03.2023, 15:39
Студворк — интернет-сервис помощи студентам
HackerVlad, много ли у тебя задач где нужно 10000 * 10000 = 100000000 раз вызывать CopyMemory? Я думаю на реальной задаче там этого выигрыша вообще не будет.
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
30.03.2023, 15:44  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
много ли у тебя задач где
Ну да, может и ерундой тут занимаемся конечно. Но зато кое что узнали. vbaCopyBytes то быстрее то медленее, memcpy тоже то быстрее то медленее в зависимости от задач. Оптимально всё таки обычное RtlMoveMemory. Хотя странно.
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
30.03.2023, 15:46
HackerVlad, в идеале самый быстрый вариант будет когда блоки будут выровнены на границу 4/8 байтов. Тогда функция отработает с максимальной скоростью.
1
 Аватар для Mikle Quits
1024 / 313 / 18
Регистрация: 21.01.2023
Сообщений: 552
30.03.2023, 15:48
Цитата Сообщение от HackerVlad Посмотреть сообщение
на 30-40 миллисекунд быстрее
И так везде по тексту, нужно либо писать "на 30-40 миллисекунд быстрее при 2 сек.", либо писать в процентах.
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
30.03.2023, 15:50  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
И так везде по тексту, нужно либо писать
Ну хорошо 15 миллисекунд с каждой секунды, вот уж выигрыш, много ли нам надо выполнять задач которые длятся больше одной секунды? Слишком мало.
0
Модератор
10069 / 3914 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 79
30.03.2023, 15:52
У меня функция Майкла отрабатывает на 800мс быстрее memcpy.
1
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
30.03.2023, 16:01  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
У меня функция Майкла отрабатывает на 800мс быстрее memcpy.
У меня на 425. Ну меня процессор 4-ядерный, наверное поэтому. А у тебя по моему 2 ядра как раз.
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
03.10.2023, 18:21
Вот хорошая функция основаная на GetMem4, LSet, березовых бронках и брусничном варенье ) Про скорость не знаю, но должно работать качественно, что сказали, то и скопирует )
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
Public Declare Function GetMem4 Lib "msvbvm60" (Src As Any, Dst As Any) As Long
 
Sub MemCopyLs2(Src&, Dst&, Size&)
    Dim ltmp&, sIn$, sOut$
    
    GetMem4 ByVal Src, ltmp 'сохраняем 1е 4 байта из источника
    Size = Size - &H4&
                            'мапим строки на данные (со смещением 4 байта, в которых будет зписан размер строк)
    GetMem4 Size, ByVal Src 'записываем размер в первые 4 байта обоих блоков
    GetMem4 Size, ByVal Dst
    GetMem4 Src + &H4&, ByVal VarPtr(sOut) 'мапим строки на данные
    GetMem4 Dst + &H4&, ByVal VarPtr(sIn)
    
    LSet sIn = sOut         'копируем данные
    
    GetMem4 ltmp, ByVal Src 'восстанавливаем 1е 4 байта обоих блоков
    GetMem4 ltmp, ByVal Dst
    GetMem4 0&, ByVal VarPtr(sOut) 'освобожаем строки от указателей
    GetMem4 0&, ByVal VarPtr(sIn)
End Sub
Sub testMemCopyLs2()
    Dim s1, s2, dest(10), sorc()
    
    s1 = "Hello World"
    s2 = "Kamaz"
    sorc = Array(1, 2, 3, 4)
    
    MemCopyLs2 StrPtr(s2), StrPtr(s1) + 12, LenB(s2)
    Stop 'см отладчик (Locals)
    MemCopyLs2 VarPtr(sorc(0)), VarPtr(dest(3)), 16 * (UBound(sorc) + 1)
    Stop 'см отладчик
End Sub
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
03.10.2023, 22:20  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Про скорость не знаю
а вот про скорость надо знать!!!

Добавлено через 2 минуты
Цитата Сообщение от testuser2 Посмотреть сообщение
Src&
Вместо "Src&" просьба писать "Src As Long"

Добавлено через 4 минуты
testuser2, жаль ты только по VBA мастер, вот мог бы ты хоть одни пример мне на VB6 написать...
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
04.10.2023, 01:40
Это на VB. Специально пошел, включил VB6 все работает. Копируешь в стандартный модуль, ставишь точку останова на testMemCopyLs2, копируешь "testMemCopyLs2" в immediate, нажимаешь Enter. Дальше выполняешь пошагово через F8 и смотришь в Locals как меняются переменные. Если нужно выполнить без вхождения в процедуру Shift+F8. Работу с памятью проще увидеть отладчике, чем городить какую-то свистоперделку, я так считаю.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.10.2023, 01:40

Подскажите пожалуйста только начал изучать WinApi
Написать приложение которое угадывает задуманное пользователем число от 1 до ста.для запроса к пользователю использовать окна...

GPSS задача не запускается. Только новенький в этом, подскажите c реализацией, пожалуйста
Задания проходят последовательно операции ввода, обработки и вывода. Скорость ввода и вывода заданий 120 Мб/мин. Для обработки используются...

Подскажите пожалуйста как из текста Edit выделить только последний символ ?
Здравствуйте. Подскажите пожалуйста как из текста Edit выделить только последний символ ? независимо сколько там символов - 5 символов или...

Подскажите плз аналог php функции print_r, или как преобразовать массив в string?
Может кто сталкивался...

Подскажите пожалуйста можна ли убрать то что в середине, оставить только контур окружности
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,...


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

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Новые блоги и статьи
Часы с термометром и праздничным календарем
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, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru