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

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

29.03.2023, 12:32. Показов 2838. Ответов 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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 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
759 / 278 / 14
Регистрация: 21.01.2023
Сообщений: 397
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
759 / 278 / 14
Регистрация: 21.01.2023
Сообщений: 397
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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru