Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769

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

29.03.2023, 12:32. Показов 2882. Ответов 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
29.03.2023, 13:01
memcpy из msvcrt должен быть быстрее. __vbaCopyBytes тоже может быть быстрее.
2
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.03.2023, 13:04  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
memcpy
Я как раз хотел сравнить скорости с memcpy из ntdll но чтобы увидеть разницу в скорости нужно прокрутить по несколько миллионов раз в цикле... потом как-нибудь посмотрю... Думал ещё про GetMemStr, SysAllocStringLen...
Точно знаю что lstrcpyW медленнее чем CopyMemory, проверял уже
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
29.03.2023, 13:07
Цитата Сообщение от HackerVlad Посмотреть сообщение
Точно знаю что lstrcpyW медленнее чем CopyMemory, проверял уже
Потому что она копирует по 2 байта. CopyMemory - такой функции нет. Самый быстрый способ - это вообще не копировать данные.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.03.2023, 13:11  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
CopyMemory
Ты прав, ты прав)))) ахаххаха подколоть меня решил)))) ну конечно же RtlMoveMemory))))

Добавлено через 2 минуты
Цитата Сообщение от The trick Посмотреть сообщение
Самый быстрый способ - это вообще не копировать данные
Ты прям гений))) аххахаха
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
29.03.2023, 13:12
HackerVlad, move и copy - разные вещи. При copy - данные просто копируются, при move еще проверяется пересекаются ли блоки.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.03.2023, 13:14  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
move и copy - разные вещи
Прекрасно знаю. И так же не понимаю почему идиоты называют то MoveMemory то CopyMemory одну и ту же функцию RtlMoveMemory.
0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 456
29.03.2023, 14:35
Цитата Сообщение от HackerVlad Посмотреть сообщение
случайно нет функции для переменной длины, чтобы была такая же быстрая как и GetMem
В SR2D.dll (Готовые решения и полезные коды на Visual Basic 6.0) есть функция, подключается так:
Visual Basic
1
Private Declare Sub CopyMemory Lib "SR2D" Alias "COPY_MEMORY" (ByRef Src As Any, ByRef Dest As Any, ByVal Length As Long)
Я её туда вписывал как раз ради скорости, сравни, ради интереса.
Обрати внимание, Src и Dest в непривычном порядке.
Если объявить через tlb, будет ещё быстрее.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
29.03.2023, 17:01  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
В SR2D.dll
Спасибо, но это же надо библиотеку с собой тягать тогда. Не очень вариант. Я рассчитывал на майкрософтовские функции. Чтобы ничего не тягать с собой.

Добавлено через 2 часа 23 минуты
Mikle Quits, а вы сравнивали скорости RtlMoveMemory и вашей COPY_MEMORY? На каком языке вы написали библиотеку?
0
 Аватар для Mikle Quits
769 / 286 / 17
Регистрация: 21.01.2023
Сообщений: 456
29.03.2023, 20:56
Сравнивал (давно, когда писал). На коротких фрагментах у меня был выигрыш.
Писал на C++ 2008 Express, но там Naked ассемблерная функция.

Добавлено через 2 часа 13 минут
Хм... сейчас сравнил - совпадает с RtlMoveMemory по скорости до долей процента. Видимо, в x64 системе бутылочное горлышко где-то не здесь.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.03.2023, 01:37  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
совпадает с RtlMoveMemory по скорости
У меня тоже 64-битная винда, ну значит нет смысла уже теперь использовать вашу библиотеку.

Добавлено через 4 часа 37 минут
Цитата Сообщение от The trick Посмотреть сообщение
move и copy - разные вещи
А есть функция RtlCopyMemory? Я не знал про её существование. В NTDLL? И что она быстрее? Если честно я плохо понимаю чем Move от Copy отличается...
Зато нашёл на другом форуме что-то про пересечение блоков, что это такое вообще, ты писал на другом форуме "__vbaCopyBytes будет быстрее т.к. не проверяет блоки на пересечение." Фиг его знает я плохо знаю всё это.
Ты наверное пользуешься какой-то специальной программой для того чтобы смотреть на эти блоки оперативной памяти там в гексодах скорее всего по адресам, я не знаю вообще не шарю, в процесс хакере заколебёшься искать то что надо найти в памяти процесса например.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.03.2023, 11:25  [ТС]
Зачем уважаемый The trick в своих кодах называет memcpy вот так:
Private Declare Sub memcpy Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Я этого так и не понял. Обман получается.

Добавлено через 58 секунд
Искал как объявить настоящее memcpy так и не нашёл. Придётся в MSDN лезть.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
30.03.2023, 11:31
Цитата Сообщение от HackerVlad Посмотреть сообщение
Если честно я плохо понимаю чем Move от Copy отличается...
Цитата Сообщение от HackerVlad Посмотреть сообщение
Прекрасно знаю.
так знаешь или не знаешь?
Цитата Сообщение от The trick Посмотреть сообщение
move и copy - разные вещи. При copy - данные просто копируются, при move еще проверяется пересекаются ли блоки.
При копировании копируемые блоки могут перекрываться. К примеру если ты сдвигаешь массив.

Добавлено через 3 минуты
Цитата Сообщение от HackerVlad Посмотреть сообщение
Зачем уважаемый The trick в своих кодах называет memcpy вот так:
Потому что мне так удобнее - это короче чем CopyMemory и RtlMoveMemory. Тебя не смущает почему все ее называют CopyMemory?

Цитата Сообщение от HackerVlad Посмотреть сообщение
Искал как объявить настоящее memcpy так и не нашёл. Придётся в MSDN лезть.
Потому что memcpy CDecl функция и из VB6 ее не так просто вызвать без моего Add-in'а.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.03.2023, 11:40  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
так знаешь или не знаешь?
ахаххахаха
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
30.03.2023, 11:47
по теме memcpy из msvcrt уже векторные инструкции поддерживает что теоретически может повысить скорость. Еще больше повысить скорость можно переключением в 64 битный режим и выполнение инструкции оттуда. Правдо само переключение тоже время будет занимать, но для больших блоков это даст выигрыш.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.03.2023, 11:53  [ТС]
Я если честно думал что все API работают на одном ядре процессоре и что все они 32-битные. Все API до единой.

Добавлено через 1 минуту
Цитата Сообщение от The trick Посмотреть сообщение
Тебя не смущает почему все ее называют CopyMemory?
Она на самом деле Move а не Copy получается ну...

Добавлено через 44 секунды
Цитата Сообщение от HackerVlad Посмотреть сообщение
CopyMemory
Такой аллиас придумал сам майкрософт почему-то , вот все так её и называют.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
30.03.2023, 11:59
Цитата Сообщение от HackerVlad Посмотреть сообщение
Она на самом деле Move а не Copy получается ну...
Цитата Сообщение от HackerVlad Посмотреть сообщение
Такой аллиас придумал сам майкрософт почему-то , вот все так её и называют.
Потому что она фактически и делает copy. Просто memcpy из С имеет ограничение, поэтому там имеется memmove. В VB6 мы таких ограничений не имеем.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.03.2023, 12:01  [ТС]
The trick, решил протестировать __vbaCopyBytes, чтобы не писать самому проект, взял по быстрому переделал твой проект prjGetMemOptimize by The Trick и добавил туда ещё одну кнопку для CopyBytes и написал и что ты думаешь...
Результат меня шокировал CopyBytes медленнее на целую секунду что в циклах работы по указателю что по прямой передаче
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
30.03.2023, 12:02
HackerVlad, давай сюда тесты скидывай будем смотреть.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.03.2023, 12:03  [ТС]
Объявлял вот так вот:
Visual Basic
1
Private Declare Function CopyBytes Lib "msvbvm60.dll" Alias "__vbaCopyBytes" (ByVal ByteLen As Long, Destination As Any, Source As Any) As Long
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.03.2023, 12:03
Помогаю со студенческими работами здесь

Подскажите пожалуйста только начал изучать 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,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru