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

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

29.03.2023, 12:32. Показов 2871. Ответов 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
30.03.2023, 15:39
Студворк — интернет-сервис помощи студентам
HackerVlad, много ли у тебя задач где нужно 10000 * 10000 = 100000000 раз вызывать CopyMemory? Я думаю на реальной задаче там этого выигрыша вообще не будет.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.03.2023, 15:44  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
много ли у тебя задач где
Ну да, может и ерундой тут занимаемся конечно. Но зато кое что узнали. vbaCopyBytes то быстрее то медленее, memcpy тоже то быстрее то медленее в зависимости от задач. Оптимально всё таки обычное RtlMoveMemory. Хотя странно.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
30.03.2023, 15:46
HackerVlad, в идеале самый быстрый вариант будет когда блоки будут выровнены на границу 4/8 байтов. Тогда функция отработает с максимальной скоростью.
1
 Аватар для Mikle Quits
766 / 283 / 17
Регистрация: 21.01.2023
Сообщений: 438
30.03.2023, 15:48
Цитата Сообщение от HackerVlad Посмотреть сообщение
на 30-40 миллисекунд быстрее
И так везде по тексту, нужно либо писать "на 30-40 миллисекунд быстрее при 2 сек.", либо писать в процентах.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.03.2023, 15:50  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
И так везде по тексту, нужно либо писать
Ну хорошо 15 миллисекунд с каждой секунды, вот уж выигрыш, много ли нам надо выполнять задач которые длятся больше одной секунды? Слишком мало.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
30.03.2023, 15:52
У меня функция Майкла отрабатывает на 800мс быстрее memcpy.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
30.03.2023, 16:01  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
У меня функция Майкла отрабатывает на 800мс быстрее memcpy.
У меня на 425. Ну меня процессор 4-ядерный, наверное поэтому. А у тебя по моему 2 ядра как раз.
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
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
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.10.2023, 22:20  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Про скорость не знаю
а вот про скорость надо знать!!!

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

Добавлено через 4 минуты
testuser2, жаль ты только по VBA мастер, вот мог бы ты хоть одни пример мне на VB6 написать...
0
1386 / 842 / 91
Регистрация: 08.02.2017
Сообщений: 3,585
Записей в блоге: 1
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
Ответ Создать тему
Новые блоги и статьи
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(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru