powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ускорить функцию перевода массива байт в число
25 сообщений из 133, страница 3 из 6
Ускорить функцию перевода массива байт в число
    #39929486
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Polesov
Да я уже посыпал голову пеплом )
22084549
Polesov
Правда, результат будет скорректирован операцией And .
Результата может вообще не быть. Достаточно разместить массив на границе страницы памяти

Я имел ввиду, что если удастся произвести чтение 8 байт.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929487
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov
А сохранение значения регистра RSI в регистре R9 быстрее, чем сохранение в стеке?
Конечно. Во-первых доступ к регистру всегда был быстрее доступа к памяти, а во вторых push, кроме собственно mov, еще и модифицирует esp
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929489
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Polesov
А сохранение значения регистра RSI в регистре R9 быстрее, чем сохранение в стеке?
Конечно. Во-первых доступ к регистру всегда был быстрее доступа к памяти, а во вторых push, кроме собственно mov, еще и модифицирует esp

Понятно. Просто привык экономить на использовании регистров )
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929516
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Polesov
А сохранение значения регистра RSI в регистре R9 быстрее, чем сохранение в стеке?
Конечно. Во-первых доступ к регистру всегда был быстрее доступа к памяти, а во вторых push, кроме собственно mov, еще и модифицирует esp
Почти так, но не совсем. Если часть стека, куда делается push, лежит в кеше процессора, то затраты по времени такие же, как регистр -> регистр.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929517
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд
Если часть стека, куда делается push, лежит в кеше процессора, то затраты по времени такие же, как регистр -> регистр.
+ модификация esp. Т.е. затраты все же больше в любом случае
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929533
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Polesov
А сохранение значения регистра RSI в регистре R9 быстрее, чем сохранение в стеке?
Конечно. Во-первых доступ к регистру всегда был быстрее доступа к памяти, а во вторых push, кроме собственно mov, еще и модифицирует esp


Сделал тест:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure BalhBlah;
asm
//    Mov   R9,   RSI
//    Mov   RSI,  R9
    Push  RSI
    Pop   RSI
end;

procedure TForm11.Button1Click(Sender: TObject);
var
  b : Int64;
  e : Int64;
  i : integer;
begin
  QueryPerformanceCounter( b );
  for i := 0 to 100000000 do
    BalhBlah;
  QueryPerformanceCounter( e );
  Caption := IntToStr( e - b );
end;



По результатам 3-х измерений:

1. вариант сохранения в регистре: 636401, 637557, 641079
2. вариант сохранения через стек: 586241, 583948, 584917

OP-коды сохранения через стек однобайтовые.
Думаю, что время модификации регистра ESP на аппаратном уровне кране мало.
Отсюда и незначительный выигрыш по времени, так как Mov регистр, регистр - OP-коды трехбайтовые.
А незначительный потому, что регистр - регистр быстрее, чем регистр - память.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929588
_Vasilisk_
Только автору нужно было вытащить определенные байты из массива, а не первые 8


Пример очень гибкий
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <iostream>
#include <byteswap.h>

uint64_t Calc(const uint8_t * array, int pos) {
  return *((uint64_t*)(array + pos)) << 8 * pos;
}

int main()
{
  unsigned char abc[24] = {2, 5, 2, 5, 8, 1, 1, 7, 3, 6, 9, 4, 8, 3, 1, 2, 4, 6, 3, 2,
      5, 6, 7, 8};
  
  uint64_t f = bswap_64(Calc(abc, 0));
  f = (f << 8*7) |  Calc(abc, 8);
  f = (f << 8*7) |  Calc(abc, 8);
  
  std::cout << bswap_64(f) << "!\n";
}



Только вот Я не понял, кто врёт.. C++ или Delphi потому что последние байты всегда неверные

В c++ = 217871544892981507
В delphi = 217871544892981506
Код: 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.
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;

var
  arr: array of byte;

begin
  try
    arr := [2, 5, 2, 5, 8, 1, 1, 7, 3, 6, 9, 4, 8, 3, 1, 2, 4, 6, 3, 2, 5, 6, 7, 8];

    Writeln(to_num(arr, 0, 15));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.



Так же если мы будем 16 байт складывать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
// Example program
// Example program
#include <iostream>
#include <byteswap.h>

uint64_t Calc(const uint8_t * array, int pos) {
  return *((uint64_t*)(array + pos)) << 8 * pos;
}

int main()
{
  unsigned char abc[16] = {2, 5, 2, 5, 8, 1, 1, 7, 3, 6, 9, 4, 8, 3, 1, 2};
  uint64_t f = bswap_64(Calc(abc, 0));
  f = (f << 8*7) |  Calc(abc, 8);
  
  std::cout << bswap_64(f) << "!\n";
}


c++ = 217871544892981511
Delphi = 217871544892981506
Код: 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.
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;

var
  arr: array of byte;

begin
  try
    arr := [2, 5, 2, 5, 8, 1, 1, 7, 3, 6, 9, 4, 8, 3, 1, 2];

    Writeln(to_num(arr, 0, 15));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.

...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929589
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov
_Vasilisk_
пропущено...
Конечно. Во-первых доступ к регистру всегда был быстрее доступа к памяти, а во вторых push, кроме собственно mov, еще и модифицирует esp


Сделал тест:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure BalhBlah;
asm
//    Mov   R9,   RSI
//    Mov   RSI,  R9
    Push  RSI
    Pop   RSI
end;

procedure TForm11.Button1Click(Sender: TObject);
var
  b : Int64;
  e : Int64;
  i : integer;
begin
  QueryPerformanceCounter( b );
  for i := 0 to 100000000 do
    BalhBlah;
  QueryPerformanceCounter( e );
  Caption := IntToStr( e - b );
end;



По результатам 3-х измерений:

1. вариант сохранения в регистре: 636401, 637557, 641079
2. вариант сохранения через стек: 586241, 583948, 584917

OP-коды сохранения через стек однобайтовые.
Думаю, что время модификации регистра ESP на аппаратном уровне кране мало.
Отсюда и незначительный выигрыш по времени, так как Mov регистр, регистр - OP-коды трехбайтовые.
А незначительный потому, что регистр - регистр быстрее, чем регистр - память.
Хммм, чуть-чуть переделал (и собрал в 32 бита, из-за вставки)


Код: 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.
unit Unit10;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm10 = class(TForm)
    MemoPush: TMemo;
    MemoReg: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form10: TForm10;

implementation

{$R *.dfm}

procedure TForm10.FormCreate(Sender: TObject);
var
  b: Int64;
  e: Int64;
  i: integer;
  a: integer;
begin
  for a := 1 to 3 do
  begin
    QueryPerformanceCounter(b);
    for i := 0 to 100000000 do
    asm
      Push  ESI
      Pop   ESI
    end;
    QueryPerformanceCounter(e);
    MemoPush.Lines.Add(IntToStr(e - b));
  end;


  for a := 1 to 3 do
  begin
    QueryPerformanceCounter(b);
    for i := 0 to 100000000 do
    asm
      Mov   EAX,   ESI
      Mov   ESI,   EAX
    end;
    QueryPerformanceCounter(e);
    MemoReg.Lines.Add(IntToStr(e - b));
  end;
end;

end.

...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929597
ВсеРазумный
Только вот Я не понял, кто врёт.. C++ или Delphi потому что последние байты всегда неверные


Врут все, в том числе и Я но больше компиляторы

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

uint64_t calcFor(const uint8_t * array, int i, int j) {
	uint64_t temp = array[i];
  for(int r = i + 1; r < j; r++)  {
	 temp = (temp << 8) | array[r];
	  std::cout << temp << "!\n";
  }

return temp;
}

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



Выдал
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
517!
132354!
33882629!
8673953032!
2220531976193!
568456185905409!
145524783591784711!
360856452077782787!
145531363364635398!
362540873927558665!
576743356907260164!
72346778582189064!
74031243330848771!
505254218987733761!
217871544892981506!
434883271474610692!
649653055243027462!
290485478829065731!
577306285402620674!
216456473394479621!
72624967858128134!
145247697971250689!
289922533221073152!



Delphi выдал
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
517
132354
33882629
8673953032
2220531976193
568456185905409
145524783591784711
360856452077782787
145531363364635398
362540873927558665
576743356907260164
72346778582189064
74031243330848771
505254218987733761
217871544892981506
434883271474610692
649653055243027462
290485478829065731
577306285402620674
216456473394479621
72624967858128134
145247697971250695
289922533221074689



Код: 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.
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];
    Writeln(Result);
  end;
end;

var
  arr: array of byte;

begin
  try
    arr := [2, 5, 2, 5, 8, 1, 1, 7, 3, 6, 9, 4, 8, 3, 1, 2, 4, 6, 3, 2,
      5, 6, 7, 1];

    Writeln(to_num(arr, 0, 24));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.




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

Хммм, чуть-чуть переделал (и собрал в 32 бита, из-за вставки)

Действительно, хммм ...

Переделал на твой вариант 32-х битный со вставкой и сравнил в вызовом BlahBlah:

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Push:
BlahBlah      Asm
640677        632305
630739        626987
625244        631055

Mov:
BlahBlah      Asm
639556        564661
633491        551562
633367        551101



Видно, что в 32-х битном варианте Mov EAX, ESI быстрее Push
Может быть, разница обусловлена битностью приложения?

Проверить 64-х битный вариант сравнения не представляется возможным из-за asm вставки.

P.S. Измерял на процессоре Intel Core i7-4790 3.6 GHz
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929613
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фасткодера на вас главного нет
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929618
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov

Видно, что в 32-х битном варианте Mov EAX, ESI быстрее Push

А вот и ответ:

в 32-битном варианте OP-коды сохранения через регистр составляют 2 байта
Код: powershell
1.
2.
089F0h        mov eax,esi
089C6h        mov esi,eax


в 64-битном варианте OP-коды сохранения через регистр составляют 3 байта
Код: powershell
1.
2.
04889F0h      mov rax,rsi
04889C6h      mov rsi,rax

Сохранение через стек в обоих вариантах по одному байту.

Поэтому в 64-битном варианте сохранение через стек чуть быстрее.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929657
Кто нибудь знает, почему вот это
Код: plaintext
1.
2.
3.
uint64_t R(uint64_t c) {
    return ((uint64_t)360858655413176578 <<  2 * 8) | (uint64_t) 144115188075855872;
}



Не тоже самое что
Код: pascal
1.
2.
3.
4.
function r(): UInt64;
begin
  Result := (UInt64(360858655413176578) shl 2 * 8) or UInt64(144115188075855872);
end;



Результатом здорового языка должен стать 506938662295044096. А Delphi компилятор с лазуром такие "Братишка, я тебе покушать принёс: 11691592161297506368"

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

открой процессорное окно и посмотри. что тут гадать? :)
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929667
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
В чём магия языка то???

Кури доки о приоритетности операторов.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929671
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
ВсеРазумный
В чём магия языка то???

Кури доки о приоритетности операторов.


У меня от конструкций " << 2 * 8" и " shl 2 * 8" потекли слезы умиления.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929676
rgreat,

Потому что ты не понимаешь логики работы, а оно работает как никак на сях всё правильно.


А я кстати нашёл ошибку тем временем в примере ТС

Надо с
Код: pascal
1.
 for k := (i + 1) to j do


Заменить на
Код: pascal
1.
 for k := (i + 1) to i + j do



Тогда он перестанет выводить каких 5. И
Код: pascal
1.
2.
3.
  Writeln(to_num([5, 8, 5], 0, 2)); // Тут по прежнему будет 329733

  Writeln(to_num([8, 5, 2, 7, 9, 2, 7, 9, 2, 5, 8, 5, 6, 7, 8, 1], 9, 2)); // А тут станет 329733 вместо 5
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929678
А я ползаю и думаю, чего у меня результаты не сходятся.. Решил покурить пример ТС и нашёл ошибку. Теперь работает как надо Хехе
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929683
Вот перевёл малёк, но уже оценить работу можно

Код: 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.
71.
72.
73.
74.
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 i + 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;

function Convert2(arr: UInt64): UInt64;
asm
  {$IF Defined(CPUX86)}
 // 64 bit!!!1 ONLY пока что 
  {$ELSEIF Defined(CPUX64)}
  mov     rax, arr
  bswap   rax
  {$ENDIF}
end;

function calc(arr: array of byte; pos, len: integer): UInt64;
begin
  Result := PUInt64(@arr[pos])^ shl (8 * (8 - len));
end;

function Test(arr: array of byte): UInt64;
var
  A, C: UInt64;
begin
  A := Convert2(calc(arr, 1, 8));
  C := Convert2(calc(arr, 9, 3));

  Result := (A shl (8 * 3)) + C;
end;

var
  arr: array of byte;

begin
  try
    arr := [1, 5, 9, 37, 69, 2, 7, 9, 62, 5, 8, 5, 6, 1, 13, 1];

    Writeln(to_num(arr, 1, 8 + 2));
    Writeln(Test(arr));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.




4972544674847066117 << Фикшенная функция ТС

4972544674847066117 << Моя функция
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929704
Не нашёл времени реализовать asm для 32 бит, реализовал только для 64. И в интернете нашёл swap

А так же добавил пример такого
Код: pascal
1.
writeln(to_num(arr, 1, 8 + 1 + 3));



Код: 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.
71.
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 i + j do
  begin
    Result := Result shl 8;
    Result := Result or arr[k];
  end;
end;

function Convert3(arr: array of byte; pos, len: integer): UInt64;
{$IF Defined(CPUX86)}
var
  Lo, Hi: Cardinal;
begin
  Result := PUInt64(@arr[pos])^ shl (8 * (8 - len));

  Lo := Int64Rec(Result).Hi;
  Hi := Int64Rec(Result).Lo;
  Int64Rec(Result).Hi := (Hi shr 24) or ((Hi and $00FF0000) shr 8) or
    ((Hi and $0000FF00) shl 8) or (Hi shl 24);
  Int64Rec(Result).Lo := (Lo shr 24) or ((Lo and $00FF0000) shr 8) or
    ((Lo and $0000FF00) shl 8) or (Lo shl 24);
{$ELSEIF Defined(CPUX64)}
asm
  movsxd  rax, pos
  mov     rax, qword ptr [arr + rax]
  lea     ecx, [8*len]
  neg     cl
  shl     rax, cl
  bswap   rax
  {$ENDIF}
end;

function test(arr: array of byte): UInt64;
var
  A, B, C: UInt64;
begin
  A := Convert3(arr, 1, 8);
  C := Convert3(arr, 1 + 8, 1 + 1);
  B := Convert3(arr, (1 + 8) + (1 + 1), 3);

  Result := (A shl (8 * (1 + 1)) or C) shl (8 * 3) or B;
end;

var
  arr: array of byte;

begin
  try
    arr := [1, 5, 9, 37, 69, 2, 7, 69, 62, 153, 8, 5, 6, 1, 13, 1];

    writeln(to_num(arr, 1, 8 + 1 + 3));
    writeln(test(arr));
  except
    on E: Exception do
      writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.



Думаю понятно привёл пример, если кому то взбредёт в голову реализовать цикл для 8 байт + shl пучка

Код полностью рабочий, и выдаёт те же результаты
to_num : 523893758643996161
test : 523893758643996161
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929799
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный, где ошибка то? у меня в параметрах функции передается начальный и конечные позиции, а не начало и длина
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929801
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за старания и внимание. Ассемблерские вставки буду использовать только если совсем прижмет. AQTime показывает, что и так сойдет).
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929802
cptngrb,

Как где ошибка ? Ты только на начальной позиции можешь узнать элементы. А вот со второй части ты никогда не узнаешь.
...
Рейтинг: 0 / 0
Ускорить функцию перевода массива байт в число
    #39929804
cptngrb,

То есть есть строка 12345678_12345678

Ты с ошибкой в коде можешь узнать только до _ черты к примеру с 5 по 8 элемент. А вот с 10 элемента по 14 ты никогда не узнаешь с ошибкой в коде
...
Рейтинг: 0 / 0
25 сообщений из 133, страница 3 из 6
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ускорить функцию перевода массива байт в число
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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