PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » CopyMemory


CopyMemory

Сообщений 1 страница 22 из 22

1

memcpy
Ну написал свою, только толку то, она медленнее вшитой CopyMemory, видать та на ассемблере что ли написана.

Код:
Procedure mem_copy(*Source, *Dest,  Size)
  For i = 1 To  Size  / SizeOf(Integer)
    PokeI(*Dest,  PeekI(*Source))
    *Source + SizeOf(Integer)
    *Dest   + SizeOf(Integer)
  Next
  For i = 1 To  Size  % SizeOf(Integer)
    PokeB(*Dest,  PeekB(*Source))
    *Source + SizeOf(Byte)
    *Dest   + SizeOf(Byte)
  Next
EndProcedure

раньше там были вызовы memcpy из библиотеки Си... щас не знаю... всё встроено (эта библиотека си), а вот функция неужели из этой библиотеки си написана на ассемблере.

Отредактировано PSY (10.02.2025 19:20:39)

0

2

Как минимум, надо избавляться от Poke

0

3

Да и вычисление количества итераций на каждой итерации цикла скорости не прибавит.

0

4

Smitis написал(а):

Да и вычисление количества итераций на каждой итерации цикла скорости не прибавит.

разве не оптимизируется в значение а не постоянное вычисление выражения?
и poke как я смотрел дизассемблированные версии - там было раньше по типу mov адрес, значение.

Отредактировано PSY (10.02.2025 20:58:56)

0

5

Чем упомянутая memcpy не подошла?

Код:
Import ""
  memcpy(*dst, *src, n)
EndImport

Dim x.a(10)
Dim y.a(10)

For i=0 To 9
  x(i) = i
Next

memcpy(@y(), @x(), 10)

For i=0 To 9
  Debug y(i)
Next

0

6

Может теперь c-backend и оптимизирует. Раньше, вроде, не было.

0

7

Код:
EnableExplicit

Procedure mem_copy(*Source.Ascii, *Dest.Ascii,  Size.i)
  Define Last.i = *Source + Size
  While *Source < Last
    *Dest\a = *Source\a
    *Source + SizeOf(Ascii)
    *Dest   + SizeOf(Ascii)
  Wend
EndProcedure

Dim A.a(10)
Dim B.a(10)

Define i
For i = 0 To 9 : A(i) = i : Next

mem_copy(@A(), @B(), 10)

0

8

PSY написал(а):

разве не оптимизируется в значение а не постоянное вычисление выражения?

а как можно оптимизировать если указана переменная, а не явное число? Если только оптимизатор поймёт, что внутри цикла отсутствует изменение переменной Size и создаст временную переменную, чтобы поместить в неё результат вычисления далее использовать как постоянное число. Но при условии что вы знаете что оптимизатор это сделает.

0

9

useful это должно быть дольше, в си библиотеке оптимизация именно на том что возможные данные по int копируются а остаточные по byte. Ладно, я просто поинтересовался, необходимости в этом нет, просто интересно.

0

10

PSY написал(а):

разве не оптимизируется в значение а не постоянное вычисление выражения?

фор задуман вычислять в каждой итерации, так что оптимизация крайне сомнительна
есть вычисления, фор и пересчитывает

0

11

PSY написал(а):

useful это должно быть дольше, в си библиотеке оптимизация именно на том что возможные данные по int копируются а остаточные по byte. Ладно, я просто поинтересовался, необходимости в этом нет, просто интересно.

Я просто показал избавление от функций peek, poke  и точно не собирался оптимизацией заниматься, это же ОЧЕВИДНО! Или таки нет? :flag:

0

12

так Peek и Poke - это вставные функции по которым CALL происходит или они оптимизированы сразу на MOV?

0

13

PSY написал(а):

так Peek и Poke - это вставные функции по которым CALL происходит или они оптимизированы сразу на MOV?

Я убеждён, что всё что называется библиотечными функциями вызывается (call) т.е. имеет накладные расходы, но проверял это более 10 лет назад

https://www.purebasic.com/documentation … piler.html

-c, --commented, /COMMENTED: creates a commented 'purebasic.asm' or 'purebasic.c' output file when creating an executable. This file can be re-assembled with the '--reasm' option later when the needed modifications have been made. This option is for advanced programmers only.

Отредактировано useful (11.02.2025 15:49:17)

0

14

PSY
Если хочешь без заморочек получить ASM и Си код, то скачай мою сборку AkelPad, добавь в PureBasic кнопку "Открыть в AkelPad". Далее любой исходник открываешь в AkelPad, нажимаешь F8, вылетает меню что можно сделать с исходником и там есть пункты получить ASM и Си код, при этом полученные файлы сразу открываются в AkelPad и можешь их смотреть с подсветкой.

Подзабыл малось, нужно  скрипте AkelPad\AkelFiles\Plugs\Scripts\Menu_by_type.js указать путь к PureBasic, а то у каждого в своей папке. Там в строке 497 (может уже в другой) есть переменная "var sPBPath" (можно найти поиском этого текста) и задать путь.

Отредактировано AZJIO (11.02.2025 16:18:33)

0

15

Код:
; PokeI(*Dest,  PeekI(*Source))
  PUSH   qword [rsp+PS0+0]
  POP    rcx
  CALL   PB_PeekI
  MOV    rax,rax
  PUSH   rax
  PUSH   qword [rsp+PS0+16]
  POP    rcx
  POP    rdx
  CALL   PB_PokeI
Код:
// PokeI(*Dest,  PeekI(*Source))
quad p0=(quad)p_source;
quad rr0=PB_PeekI(p0);
quad p1=(quad)p_dest;
integer rr1=PB_PokeI(p1,rr0);
Код:
; *Dest\a = *Source\a
  MOV    rbp,qword [rsp+PS0+0]
  MOVZX  rax,byte [rbp]
  PUSH   rax
  MOV    rbp,qword [rsp+PS0+16]
  POP    rax
  MOV    byte [rbp],al
Код:
// *Dest\a = *Source\a
p_dest->f_a=p_source->f_a;
AZJIO написал(а):

Если хочешь без заморочек получить ASM и Си код

PureBasic 6.00
И много других инструментов.

0

16

Пётр написал(а):

PureBasic 6.00
И много других инструментов.

Я не вижу там выбора Си или ASM. Если не задумываться над строкой с "PB_TOOL_Debugger" то получим код с мусором отладчика. Там бы это вывести как мессагу, типа "хотите получить с отладчиком?".
По факту надо этот код дорабатывать, и уж точно открывать не в блокноте.

0

17

а то я из-за интереса написал ещё и свой динамический список и он медленнее встроенного в сотни раз хотя принцип тот же: alloc, realloc, memcpy. То есть наверное сейчас оптимизация быть может и есть но она небольшая, то есть что раньше что сейчас - сплошная мясорубка с незаточенными ножами.

0

18

Вот скриншот (похоже imgbb блокируется)
https://i.imgur.com/mRz1C7w.png

Смотря на результат, думаю надо в скрипт добавить переименование файлов, чтобы получив файл "purebasic" переименуем его в имя оригинала исходника, тогда если в папке несколько исходников, они не будут перезаписываться.

Отредактировано AZJIO (11.02.2025 16:28:50)

0

19

Есть такая забытая инструкция x86 - movsd.

0

20

egons написал(а):

Есть такая забытая инструкция x86 - movsd.

Только хотел написать, что быстрее чем REP MOVS всё равно не будет. :)

Я предполагал, что c-backend может быть оптимизированным, например, peek/poke (кроме строковых) сделаны inline-функциями и компилятор сам вставит нужную инструкцию. Также и с FOR для константного/неизменяемого выражения проведёт оптимизацию.
Но не судьба.

Отредактировано Smitis (11.02.2025 20:03:33)

0

21

AZJIO написал(а):

Смотря на результат, думаю надо в скрипт добавить переименование файлов, чтобы получив файл "purebasic" переименуем его в имя оригинала исходника, тогда если в папке несколько исходников, они не будут перезаписываться.

В идеале, ещё блокировать запуск скомпилированного purebasic.exe, удалить лишние файлы и не забыть, что это может быть dll.
Будет время, сделаю себе такое.

0

22

Smitis написал(а):

В идеале, ещё блокировать запуск скомпилированного purebasic.exe

А он запускается?
Сейчас добавил в свой js-скрипт переименование файла и мессагу "С отладчиком?". Вау, работает, в асм без отладчика 133 строки, с отладчиком 700, а в Си без отладчика 98 строк,  с отладчиком 400. Так что этот критерий ой как важен. По идее надо окно с чекбоксами, чтобы /XP /DPIAWARE включать/отключать, хотя может просто отключить их как очередной мусор, который не является кодом в том плане что мы хотим посмотреть инструкции своего кода, без лишнего мусора.

мессага

Код:
var nChoice = AkelPad.MessageBox(hMainWnd, "С отладчтиком?", "Влияние на результат", 32 /*MB_ICONQUESTION*/ , 0,
1 /*IDOK*/ , "&Да", 0x1 /*BMB_DEFAULT*/ ,
2 /*IDCANCEL*/ , "&Нет", 0);
var sDebugger = "";
if (nChoice == 1)
{
sDebugger = " /DEBUGGER";
}

переименование

Код:
if (oSys.Call("kernel32::MoveFile" + _TCHAR, newfile, newfile2)) {newfile = newfile2;}; // переименование файла

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » CopyMemory