powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поиск последовательности в бинарном массиве
25 сообщений из 270, страница 10 из 11
Поиск последовательности в бинарном массиве
    #39589485
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вот это по идее должно ускорить

Код: pascal
1.
2.
3.
4.
5.
6.
function HexToByte(const Value: Cardinal): Cardinal; inline;
begin
  Result := (Value or $20) - Cardinal('0');
  if (Result > 9) then
    Dec(Result, Ord('a') - Ord('0') - 10);
end;
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39589507
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без инлайна
Nyashik: 0,719825
SOFTFORYOU: 0,724851
Bellic: 11,049624


С инлайном
Nyashik: 0,842163
SOFTFORYOU: 0,896055
Bellic: 11,008099
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39589515
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StartCode: 0,655306
StartCodeTBytes: 0,434061



Код: 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.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
unit Unit1;

interface

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

const
  TestCount = 10000000;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    procedure Test(Sender: TObject);
    procedure ReadFile;
    procedure StartCode;
    procedure StartCodeTBytes;
    procedure BeginTime;
    function EndTime: string;
  private
    { Private declarations }
  public
    StartTime, StopTime: Int64;
    iCounterPerSec: Int64;

    FFile: TFileStream;
    BFile: TBytes;
    Dlina, Addr: Integer;
  end;

var
  Form1: TForm1;
  I, m: Integer;

implementation

{$R *.dfm}

procedure TForm1.BeginTime;
begin
  QueryPerformanceCounter(StartTime);
end;

function TForm1.EndTime: string;
begin
  if QueryPerformanceCounter(StopTime) and QueryPerformanceFrequency
    (iCounterPerSec) then
    Result := Format('%.6f', [(StopTime - StartTime) / iCounterPerSec]);
end;

function HexToByte(const Value: Byte): Byte;
begin
  Result := (Value or $20) - Byte('0');
  if (Result > 9) then
    Dec(Result, Ord('a') - Ord('0') - 10);
end;

procedure TForm1.ReadFile;
begin
  if not OpenDialog1.Execute then
    exit;

  FFile := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
  try
    SetLength(BFile, FFile.Size);
    FFile.ReadBuffer(BFile, FFile.Size);
  finally
    FFile.Free;
  end;

  Addr := 0;
  Dlina := 6;

end;

procedure TForm1.StartCode;
var
  RawString: RawByteString;
  PSimvol: Byte;
  x: Byte;
begin
  SetLength(RawString, Dlina);
  for I := 1 to TestCount do
  begin
    for m := 0 to Dlina - 1 do
    begin
      x := Addr + m * 2;
      PSimvol := (HexToByte(BFile[x]) shl 4) + HexToByte(BFile[x + 1]);

      RawString[m + 1] := AnsiChar(PSimvol);
    end;
  end;
end;

procedure TForm1.StartCodeTBytes;
var
  ArrBytes: TBytes;
  PSimvol: Byte;
  x: Byte;
begin
  SetLength(ArrBytes, Dlina);
  for I := 1 to TestCount do
  begin
    for m := 0 to Dlina - 1 do
    begin
      x := Addr + m * 2;
      ArrBytes[m + 1] := (HexToByte(BFile[x]) shl 4) + HexToByte(BFile[x + 1]);
    end;
  end;
end;

procedure TForm1.Test(Sender: TObject);
begin
  ReadFile;

  BeginTime;
  StartCode;
  Memo1.Lines.Add('StartCode: ' + EndTime);

  BeginTime;
  StartCodeTBytes;
  Memo1.Lines.Add('StartCodeTBytes: ' + EndTime);

end;

end.

...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39589517
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUТут очень странный человек
Тебя учат работать с хексом, показывают, как ускорить твой код. А ты говоришь, что я о...ел.
Ну если не хочешь - я не стану помогать с твоим кодом
Извини, но у тебя очень странные манеры обучения!
Причину моего возмущения - я тебе объяснил! Только не говори, что не понял ее!
Если обидел своей несдержиннастью - не серчай, я и правда очень спешил тогда..((

SOFT FOR YOUРаз уж у тебя тест под рукой - можешь сделать вывод в TBytes, а не RawByteString. Он по идее ещё раза в полтора должен быстрее работать
Если это касается моей темы "Поиска и замены.." - в этом цикле мы готовили один из параметров для процедуры Поиска и Замены, который Вы, SOFT FOR YOU, предложили сделать на RawByteString и Pos()...
Тогда по идее нужно будет переделывать и ее на TBytes?
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39589522
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Ну как я и говорил )
Полтора раза ))
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39589523
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bellic,

Ты же сам всё прекрасно знаешь
Что я тебе буду объяснять
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39589614
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Отдыхая, проветривая мозг... Я начал обдумывать твою оптимизацию функции...
Полез в asm и увидел, что можно сократить его на 1 лишнюю инструкцию
Код: pascal
1.
0FB600           movzx eax,[eax]



Но увы и ах... Мне не удалось сделать это из кода

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function HexToByte(const Value: Byte): Byte;
asm
  or al,$20
  sub al,$30
  cmp al,$09
  jbe @exit
  sub al,$27
@exit:
end;



Результат выполнения

StartCode: 0,639610
StartCodeTBytes: 0,414529
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39589618
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Попробуй так (не проверял)

function HexToByte(const Value: Cardinal): Cardinal;
asm
or eax, $20
lea ecx, [eax - $57]
cmp eax, $39
lea eax, [eax - $30]
cmova eax, ecx
end;
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39589621
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Стало гораздо лучше

StartCode: 0,566828
StartCodeTBytes: 0,411922
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590183
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял, о чем идет речь, то можно попробовать по 2 байта за раз
Код: pascal
1.
2.
3.
4.
function HexToByte(Value: Cardinal): Cardinal;
begin
  Result:=(Value and $4040 * $02402400 + Value and $0F0F * $10010000) shr 24;
end;
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590201
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Мне кажется лучше так (но я не тестировал)

Код: pascal
1.
2.
3.
4.
function HexToByte(Value: Integer{Word}): Integer;
begin
  Result := (Value - $3030) + ((Value and $4040) shr 4) * -$27;
end;
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590203
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shr 6 наверно )
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590207
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

моя переставляет для little endian, если переставлять не надо, то наверно можно проще
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590219
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Да, ты прав. У тебя же ещё микс байт делается. Только Cardinal лучше на Integer заменить - там нет ограничения на регистры.

Кстати изложи логику расстановки констант. Ребятам, да и мне тоже, будет познавательно.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590294
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Логика прозрачная.
Финальный сдвиг на 24, чтобы не надо было в конце and-ить с $FF.
$0F0F - очевидное выделение младших ниблов для цифр и букв.
В константе $10010000 старшая единица ставит на место биты 0..3, младшая - биты 8..11, т.е. переставили.
Замечаем, что при этом буковки дают результат на 9 меньше положенного.
Недостающую 9 формируем аналогично из битов $4040, которые не присутствуют в цифрах.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590303
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не одна из функций, не работает правильно...

У Aleksandr Sharahov функция не работает как надо.


SOFT FOR YOU Asm: 0,414427
SOFT FOR YOU Code: 0,455227
MyAsm: 0,398304


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function TestHexToByte(Value: Byte): Byte;
asm
  mov ecx, eax
  shr ecx, 6
  and ecx, 257
  imul ecx, ecx, -39
  lea eax, [eax + ecx - 12336]
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.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
unit Unit1;

interface

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

const
  TestCount = 10000000;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    procedure Test(Sender: TObject);
    procedure ReadFile;
    procedure StartCodeTestHexToByte;
    procedure StartCode;
    procedure StartCodeAsm;
    procedure BeginTime;
    function EndTime: string;
  private
    { Private declarations }
  public
    StartTime, StopTime: Int64;
    iCounterPerSec: Int64;

    FFile: TFileStream;
    BFile: TBytes;
    Dlina, Addr: Integer;
  end;

var
  Form1: TForm1;
  I, m: Integer;

implementation

{$R *.dfm}

procedure TForm1.BeginTime;
begin
  QueryPerformanceCounter(StartTime);
end;

function TForm1.EndTime: string;
begin
  if QueryPerformanceCounter(StopTime) and QueryPerformanceFrequency
    (iCounterPerSec) then
    Result := Format('%.6f', [(StopTime - StartTime) / iCounterPerSec]);
end;

function HexToByteAsmSOFTFORYOU(const Value: Cardinal): Cardinal;
asm
  or eax, $20
  lea ecx, [eax - $57]
  cmp eax, $39
  lea eax, [eax - $30]
  cmova eax, ecx
end;

function HexToByteSOFTFORYOU(Value: Integer { Word } ): Integer;
begin
  Result := (Value - $3030) + ((Value and $4040) shr 6) * -$27;
end;

function TestHexToByte(Value: Byte): Byte;
asm
  mov ecx, eax
  shr ecx, 6
  and ecx, 257
  imul ecx, ecx, -39
  lea eax, [eax + ecx - 12336]
end;

procedure TForm1.ReadFile;
begin
  if not OpenDialog1.Execute then
    exit;

  FFile := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
  try
    SetLength(BFile, FFile.Size);
    FFile.ReadBuffer(BFile, FFile.Size);
  finally
    FFile.Free;
  end;

  Addr := 0;
  Dlina := 6;

end;

procedure TForm1.StartCodeAsm;
var
  ArrBytes: TBytes;
  PSimvol: Byte;
  x: Byte;
begin
  SetLength(ArrBytes, Dlina);
  for I := 1 to TestCount do
  begin
    for m := 0 to Dlina - 1 do
    begin
      x := Addr + m * 2;
      ArrBytes[m + 1] := (HexToByteAsmSOFTFORYOU(BFile[x]) shl 4) +
        HexToByteAsmSOFTFORYOU(BFile[x + 1]);
    end;
  end;
end;

procedure TForm1.StartCode;
var
  ArrBytes: TBytes;
  PSimvol: Byte;
  x: Byte;
begin
  SetLength(ArrBytes, Dlina);
  for I := 1 to TestCount do
  begin
    for m := 0 to Dlina - 1 do
    begin
      x := Addr + m * 2;
      ArrBytes[m + 1] := (HexToByteSOFTFORYOU(BFile[x]) shl 4) +
        HexToByteSOFTFORYOU(BFile[x + 1]);
    end;
  end;
end;

procedure TForm1.StartCodeTestHexToByte;
var
  ArrBytes: TBytes;
  PSimvol: Byte;
  x: Byte;
begin
  SetLength(ArrBytes, Dlina);
  for I := 1 to TestCount do
  begin
    for m := 0 to Dlina - 1 do
    begin
      x := Addr + m * 2;
      ArrBytes[m + 1] := (TestHexToByte(BFile[x]) shl 4) +
        TestHexToByte(BFile[x + 1]);
    end;
  end;
end;

procedure TForm1.Test(Sender: TObject);
begin

  ReadFile;

  BeginTime;
  StartCodeAsm;
  Memo1.Lines.add('SOFT FOR YOU Asm: ' + EndTime);

  BeginTime;
  StartCode;
  Memo1.Lines.add('SOFT FOR YOU Code: ' + EndTime);

  BeginTime;
  StartCodeTestHexToByte;
  Memo1.Lines.add('MyAsm: ' + EndTime);

end;

end.

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

Эта фраза не сюда относилась. Перепутал форумы. И пока делал тесты, не заметил что это сюда написал
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590315
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикУ Aleksandr Sharahov функция не работает как надо.


Возможно, я не понимаю, как надо.
Поясни.
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590322
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

Я просто глянул на результаты, и увидел что они отличаются от того, что было. А потом глянул, что генерируется у SOFT FOR YOU и переделал под ASM
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590348
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Александр (и я неудачно попытался повторить) реализовал чтение не одного, а сразу двух байт. А в твоём тесте его функция вызывается дважды
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590358
kep-ko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НяшикЯ вздёрнул всех смотри, а то пропишут на пмж в баллистическую ракету ( http://smartfiction.ru/prose/sens_of_power/ )

зы. Прeдлагаю затестить табличку в 64KB !
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590362
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kep-ko,

Давно пора :)
Но мы оптимизируем чтение хексового буфера ТС с массивом замен
А на самом деле надо оптимизировать поиск и замену :)
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590399
kep-ko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOUна самом деле надо оптимизировать поиск и заменуопять-таки 'табличка' по первому байту(символу) искомых строк :)
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590401
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kep-ko,

Ога
Ахо-Корасик
...
Рейтинг: 0 / 0
Поиск последовательности в бинарном массиве
    #39590478
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovВ константе $10010000 старшая единица ставит на место биты 0..3, младшая - биты 8..11, т.е. переставили.
Логически я это понимаю. Не могу самостоятельно в случае чего просчитать такую константу.

Вот есть число 00000X0Y
Необходимо получить YX~~~~~~
Соответственно Y нужно поместить на место 28 бита, X нужно поместить на 24 бит.

Соответственно для Y у меня выходит константа $0001 shl 28
А для X я подставляю $0100 shl (24 - 8). И это не правильно.

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


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