powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ускорить функцию перевода массива байт в число
25 сообщений из 133, страница 2 из 6
Ускорить функцию перевода массива байт в число
    #39929135
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что началось то? Какашки на вентилятор? Ну не знаете и не знаете. Не хотите как хотите.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929136
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov, меня интересует в этом топике ровно то, что я спросил. Архитектура, подходы и "все херня, переделывай" решил в другой раз спросить
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929139
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, Спасибо за ответ. Тему можно закрывать.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929141
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего и не тормозило. Ничего не зависает. Никакие ошибки не вылетают...пока) Просто хочется быстрее
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929145
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrbПросто хочется быстрее

Тебе уже сказали: профилируй. Места, стоящий оптимизации наобум ищутся плохо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929148
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, ага
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929154
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Попробуйте вот это
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function to_num(const arr: arBytes; const i,j: NativeInt):UInt64;
asm
  mov r9, rsi
  add rcx, rdx
  mov rsi, rcx
  mov rcx, r8
  sub rcx, rdx
  inc rcx
  xor rax, rax
  @start:
    shl rax, 8
    lodsb
  loop @start
  mov rsi, r9
end;

хотя абсолютно согласен с
Dimitry Sibiryakov
Тормоза не в том коде, который ты показал.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929156
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, обратил внимание, что последний параметр в XE3 записывается в r8d несмотря на NativeInt
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929250
_Vasilisk_
cptngrb,

Попробуйте вот это
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function to_num(const arr: arBytes; const i,j: NativeInt):UInt64;
asm
  mov r9, rsi
  add rcx, rdx
  mov rsi, rcx
  mov rcx, r8
  sub rcx, rdx
  inc rcx
  xor rax, rax
  @start:
    shl rax, 8
    lodsb
  loop @start
  mov rsi, r9
end;

хотя абсолютно согласен с
Dimitry Sibiryakov
Тормоза не в том коде, который ты показал.



А потом почему гнобят людей которые пишут на ассемблере ?
Project Project1.exe raised exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929259


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function Convert(arr: array of byte): UInt64;
asm
  {$IF Defined(CPUX86)}
  mov     edx, DWORD PTR [eax]
  mov     eax, DWORD PTR [eax+4]
  bswap   edx
  bswap   eax
  {$ELSEIF Defined(CPUX64)}
  mov rax, qword ptr [arr]
  bswap  rax
  {$ENDIF}
end;



Код: pascal
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

function to_num(arr: array of byte; const i, j: integer): UInt64;
var
  k: integer;
begin
  Result := arr[i];
  for k := (i + 1) to j do
  begin
    Result := Result shl 8;
    Result := Result or arr[k];
  end;
end;

function Convert(arr: array of byte): UInt64;
asm
  {$IF Defined(CPUX86)}
  mov     edx, DWORD PTR [eax]
  mov     eax, DWORD PTR [eax+4]
  bswap   edx
  bswap   eax
  {$ELSEIF Defined(CPUX64)}
  mov rax, qword ptr [arr]
  bswap  rax
  {$ENDIF}
end;

begin
  try
    Writeln(to_num([1, 2, 3, 4, 5, 6, 7, 8], 0, 7));
    Writeln(Convert([1, 2, 3, 4, 5, 6, 7, 8]));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.

...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929260
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb,

Сделать каст указателя unit8 в uint64?
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929271
А я тут подумал что, вроде как задача тривиальная. И по этому хочу вложить в копилку всех кто ненавидит Delphi такой вот пример


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
// Example program
#include <iostream>
#include <byteswap.h>

uint64_t Calc(unsigned char  *array, int i) {
void* p = reinterpret_cast<void*>(array + i);
return bswap_64(*static_cast<uint64_t*>(p) << 8 * i);
}

int main()
{
  unsigned char abc[8] = {1,2,3,4,5,6,7, 8};
  std::cout << Calc(abc, 5) << "!\n";
}



Calc(abc, 5) = 395016

Что аналогично для функции автора
Код: pascal
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.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

function to_num(arr: array of byte; const i, j: integer): UInt64;
var
  k: integer;
begin
  Result := arr[i];
  for k := (i + 1) to j do
  begin
    Result := Result shl 8;
    Result := Result or arr[k];
  end;
end;

begin
  try
    Writeln(to_num([1, 2, 3, 4, 5, 6, 7, 8], 5, 7));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.



Код: sql
1.
2.
3.
4.
5.
6.
7.
Calc(unsigned char*, int):                             # @Calc(unsigned char*, int)
        movsxd  rcx, esi
        mov     rax, qword ptr [rdi + rcx]
        shl     ecx, 3
        shl     rax, cl
        bswap   rax
        ret

...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929275
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Спасибо, всё понятно.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929276
crutchmaster,

Кстати, если подумали что нельзя задать максимальную длину массива... Очень ошибаетесь. Это регулируется так

return bswap_64((*static_cast<uint64_t*>(p) << 8 * (2 + 3)));

Что аналогично
Writeln(to_num([1, 2, 3, 4, 5, 6, 7, 8], 2, 4));

= 197637

А так же
return bswap_64((*static_cast<uint64_t*>(p) << 8 * (1 + 5)));

Что аналогично
Writeln(to_num([1, 2, 3, 4, 5, 6, 7, 8], 1, 2));

= 515

А так же
return bswap_64((*static_cast<uint64_t*>(p) << 8 * (1 + 3)));

Что аналогично
Writeln(to_num([1, 2, 3, 4, 5, 6, 7, 8], 1, 4));

= 33752069
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929278
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Да не, я без сарказма
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929303
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Сделать case
при желании и без кейса в принципе можно
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929339
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
Как ускорить функцию перевода массива байт в число?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function to_num(arr: arBytes; const i,j: integer):UInt64;
var
  k: integer;
begin
  Result:= arr[i];
  for k:= (i+1) to j do begin
    Result:= Result shl 8;
    Result:= Result or arr[k];
end;



Код: pascal
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
function to_num( var arr; idx, cnt : integer ) : UInt64; assembler; register;
asm
// если бы не требовалось получать результат по количеству байт, 
// то достаточно было бы следующих 2-х строк
     Add     RCX,   RDX
     Mov     RAX,   QWord Ptr [RCX]

     Cmp     R8,    01h
     Ja      @@02

     Mov     RCX,   00000000000000FFh
     Jmp     @@and

@@02:
     Cmp     R8,    02h
     Ja      @@03

     Mov     RCX,   000000000000FFFFh
     Jmp     @@and

@@03:
     Cmp     R8,    03h
     Ja      @@04

     Mov     RCX,   0000000000FFFFFFh
     Jmp     @@and

@@04:
     Cmp     R8,    04h
     Ja      @@05

     Mov     RCX,   00000000FFFFFFFFh
     Jmp     @@and

@@05:
     Cmp     R8,    05h
     Ja      @@06

     Mov     RCX,   000000FFFFFFFFFFh
     Jmp     @@and

@@06:
     Cmp     R8,    06h
     Ja      @@07

     Mov     RCX,   0000FFFFFFFFFFFFh
     Jmp     @@and

@@07:
     Cmp     R8,    07h
     Ja      @@ret

     Mov     RCX,   00FFFFFFFFFFFFFFh

@@and:
     And     RAX,   RCX

@@ret:
end;

var // тестовые данные
  a : array[0 .. 15] of byte =
    ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 );

procedure TForm11.Button1Click(Sender: TObject);
var
  i : UInt64;
begin
  i := to_num( a, 1, 5 );
end;
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929350
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
_Vasilisk_
cptngrb,

Попробуйте вот это
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function to_num(const arr: arBytes; const i,j: NativeInt):UInt64;
asm
  mov r9, rsi
  add rcx, rdx
  mov rsi, rcx
  mov rcx, r8
  sub rcx, rdx
  inc rcx
  xor rax, rax
  @start:
    shl rax, 8
    lodsb
  loop @start
  mov rsi, r9
end;

хотя абсолютно согласен спропущено...



А потом почему гнобят людей которые пишут на ассемблере ?
Project Project1.exe raised exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'.
Не нужно гнобить пишущих на ассемблере. Нужно гнобить тех, кто не понимает разницы между

Код: pascal
1.
function to_num(const arr: arBytes; const i,j: NativeInt):UInt64;



и

Код: pascal
1.
function to_num(const arr: array of Byte; const i,j: NativeInt):UInt64;



:))
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929451
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

Какгриться, всралась ашипка:
Код: pascal
1.
2.
3.
4.
function to_num( var arr; idx, cnt : integer ) : UInt64; assembler; register;
asm
     Add     RCX,   RDX
     Mov     RAX,   QWord Ptr [RCX]


В результат одним махом читаются 8 байт. И если, например, параметр "количество байт" равен 3 и индекс элемента массива указывает на третий с конца элемент, чтение выйдет за границы массива. Правда, результат будет скорректирован операцией And .
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929459
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
А потом почему гнобят людей которые пишут на ассемблере ?
Project Project1.exe raised exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'.
В оригинале первый параметр функции объявлен как динамический массив. Если вам нужен открытый массив, будьте добры переписать функцию
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929464
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function Convert(arr: array of byte): UInt64;
asm
  {$IF Defined(CPUX86)}
  mov     edx, DWORD PTR [eax]
  mov     eax, DWORD PTR [eax+4]
  bswap   edx
  bswap   eax
  {$ELSEIF Defined(CPUX64)}
  mov rax, qword ptr [arr]
  bswap  rax
  {$ENDIF}
end;

Только автору нужно было вытащить определенные байты из массива, а не первые 8
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929469
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov
Код: pascal
1.
2.
3.
4.
5.
6.
function to_num( var arr; idx, cnt : integer ) : UInt64; assembler; register;
asm
// если бы не требовалось получать результат по количеству байт, 
// то достаточно было бы следующих 2-х строк
     Add     RCX,   RDX
     Mov     RAX,   QWord Ptr [RCX]

И нарваться на AV
Код: pascal
1.
 i := to_num( a, Length(a) - 2, 2);

У нас доступны только два байта. А удастся ли прочитать еще 6 - большой вопрос
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929472
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_И нарваться на AV
Да я уже посыпал голову пеплом )
22084549
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929483
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_


Код: pascal
1.
2.
3.
4.
5.
asm
  mov r9, rsi
  :
  mov rsi, r9
end;



А сохранение значения регистра RSI в регистре R9 быстрее, чем сохранение в стеке?

Код: pascal
1.
2.
3.
4.
5.
asm
  Push   RSI
  :
  Pop    RSI
end;



По объему кода сохранение в стеке точно меньше в 3 раза )
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929485
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov
Да я уже посыпал голову пеплом )
22084549
Polesov
Правда, результат будет скорректирован операцией And .
Результата может вообще не быть. Достаточно разместить массив на границе страницы памяти
...
Рейтинг: 0 / 0
25 сообщений из 133, страница 2 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ускорить функцию перевода массива байт в число
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]