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

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

29.03.2023, 12:32. Показов 3209. Ответов 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
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
30.03.2023, 15:39
Студворк — интернет-сервис помощи студентам
HackerVlad, много ли у тебя задач где нужно 10000 * 10000 = 100000000 раз вызывать CopyMemory? Я думаю на реальной задаче там этого выигрыша вообще не будет.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
30.03.2023, 15:44  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
много ли у тебя задач где
Ну да, может и ерундой тут занимаемся конечно. Но зато кое что узнали. vbaCopyBytes то быстрее то медленее, memcpy тоже то быстрее то медленее в зависимости от задач. Оптимально всё таки обычное RtlMoveMemory. Хотя странно.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
30.03.2023, 15:46
HackerVlad, в идеале самый быстрый вариант будет когда блоки будут выровнены на границу 4/8 байтов. Тогда функция отработает с максимальной скоростью.
1
 Аватар для Mikle Quits
785 / 308 / 17
Регистрация: 21.01.2023
Сообщений: 529
30.03.2023, 15:48
Цитата Сообщение от HackerVlad Посмотреть сообщение
на 30-40 миллисекунд быстрее
И так везде по тексту, нужно либо писать "на 30-40 миллисекунд быстрее при 2 сек.", либо писать в процентах.
0
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
30.03.2023, 15:50  [ТС]
Цитата Сообщение от Mikle Quits Посмотреть сообщение
И так везде по тексту, нужно либо писать
Ну хорошо 15 миллисекунд с каждой секунды, вот уж выигрыш, много ли нам надо выполнять задач которые длятся больше одной секунды? Слишком мало.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
30.03.2023, 15:52
У меня функция Майкла отрабатывает на 800мс быстрее memcpy.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
30.03.2023, 16:01  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
У меня функция Майкла отрабатывает на 800мс быстрее memcpy.
У меня на 425. Ну меня процессор 4-ядерный, наверное поэтому. А у тебя по моему 2 ядра как раз.
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 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
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
03.10.2023, 22:20  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Про скорость не знаю
а вот про скорость надо знать!!!

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

Добавлено через 4 минуты
testuser2, жаль ты только по VBA мастер, вот мог бы ты хоть одни пример мне на VB6 написать...
0
1402 / 860 / 93
Регистрация: 08.02.2017
Сообщений: 3,671
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru