powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Арифметика указателей
4 сообщений из 4, страница 1 из 1
Арифметика указателей
    #39627140
Запутался в арифметике. По идее, если брать значение через указатель текущий строки должно быть быстрее. Однако нет, код одинаково выполняется по скорости, хотя lea и imul убираются.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Unit1.pas.56: q := b[x];
005CE327 A194415E00       mov eax,[$005e4194]
005CE32C 8B55F8           mov edx,[ebp-$08]
005CE32F 8B0490           mov eax,[eax+edx*4]
005CE332 8945F0           mov [ebp-$10],eax

Unit1.pas.56: q := z[x, y];
005CE327 6B45F865         imul eax,dword ptr [ebp-$08],$65
005CE32B 8D84858060FFFF   lea eax,[ebp+eax*4-$9f80]
005CE332 8B55F4           mov edx,[ebp-$0c]
005CE335 8B0490           mov eax,[eax+edx*4]
005CE338 8945F0           mov [ebp-$10],eax



Чую где-то подвох, но с бодуна никак не соберусь. Цель - обработать соседние точки с текущие на предмет соприкосновений по своим признакам. Думал оптимизировать прямой доступ к массиву, а он что-то не оптимизируется, только кода больше становится

Код: 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.
type
  PTestArray = ^TTestArray;
  TTestArray = array[0..100] of Integer;

var
 MyCurrent, MyPred, MyNext: PTestArray;

procedure TForm1.FormCreate(Sender: TObject);
var
  x, y: Integer;
  LTestArray: array [0..100] of TTestArray;
  LTestValue: integer;
  LIterations: integer;
  LSomeTime: integer;
begin
  LSomeTime := GetTickCount64;
  for LIterations := 0 to 50000 do
  begin
    for y := 0 to 99 do
    begin
      MyCurrent := @LTestArray[y];
      MyPred := MyCurrent;
      Dec(MyPred);
      MyNext := MyCurrent;
      Inc(MyNext);
      for x := 0 to 99 do
      begin
        {$DEFINE POINTER}
        {$IFDEF POINTER}
        LTestValue := MyCurrent[x];
        LTestValue := MyPred[x-1];
        LTestValue := MyNext[x+1];
        LTestValue := MyCurrent[x+1];
        LTestValue := MyNext[x];
        LTestValue := MyCurrent[x-1];
        LTestValue := MyPred[x];
        {$ELSE}
        LTestValue := LTestArray[x, y];
        LTestValue := LTestArray[x-1, y-1];
        LTestValue := LTestArray[x+1, y+1];
        LTestValue := LTestArray[x+1, y];
        LTestValue := LTestArray[x-1, y];
        LTestValue := LTestArray[x, y+1];
        LTestValue := LTestArray[x, y-1];
        {$ENDIF}
      end;
    end;
  end;
  Caption := inttostr(GetTickCount64 - LSomeTime);
end;
...
Рейтинг: 0 / 0
Арифметика указателей
    #39627192
Мде, походу пора переучиваться, прямой перебор бредогенератор дельфи в релиз сборке оптимальнее делает
С включенной оптимизацией 1 вариант
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Unit1.pas.50: LTestValue := LTestValue+ LTestArray[x, y];
005CE317 0318             add ebx,[eax]
Unit1.pas.51: LTestValue := LTestValue+ LTestArray[x-1, y-1];
005CE319 039848FBFFFF     add ebx,[eax-$000004b8]
Unit1.pas.52: LTestValue := LTestValue+ LTestArray[x+1, y+1];
005CE31F 0398B8040000     add ebx,[eax+$000004b8]
Unit1.pas.53: LTestValue := LTestValue+ LTestArray[x+1, y];
005CE325 0398B4040000     add ebx,[eax+$000004b4]
Unit1.pas.54: LTestValue := LTestValue+ LTestArray[x-1, y];
005CE32B 03984CFBFFFF     add ebx,[eax-$000004b4]
Unit1.pas.55: LTestValue := LTestValue+ LTestArray[x, y+1];
005CE331 035804           add ebx,[eax+$04]
Unit1.pas.56: LTestValue := LTestValue+ LTestArray[x, y-1];
005CE334 0358FC           add ebx,[eax-$04]


С включенной оптимизацией 2вариант, аж на одну инструкцию больше для каждого опроса :/
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Unit1.pas.75: LTestValue := LTestValue+ MyCurrentY[x];
005CE3C4 8B06             mov eax,[esi]
005CE3C6 031C90           add ebx,[eax+edx*4]
Unit1.pas.76: LTestValue := LTestValue+ MyPredY[x-1];
005CE3C9 A19C415E00       mov eax,[$005e419c]
005CE3CE 035C90FC         add ebx,[eax+edx*4-$04]
Unit1.pas.77: LTestValue := LTestValue+ MyNextY[x+1];
005CE3D2 A1A0415E00       mov eax,[$005e41a0]
005CE3D7 035C9004         add ebx,[eax+edx*4+$04]
Unit1.pas.78: LTestValue := LTestValue+ MyCurrentY[x+1];
005CE3DB 8B06             mov eax,[esi]
005CE3DD 035C9004         add ebx,[eax+edx*4+$04]
Unit1.pas.79: LTestValue := LTestValue+ MyNextY[x];
005CE3E1 A1A0415E00       mov eax,[$005e41a0]
005CE3E6 031C90           add ebx,[eax+edx*4]
Unit1.pas.80: LTestValue := LTestValue+ MyCurrentY[x-1];
005CE3E9 8B06             mov eax,[esi]
005CE3EB 035C90FC         add ebx,[eax+edx*4-$04]
Unit1.pas.81: LTestValue := LTestValue+ MyPredY[x];
005CE3EF A19C415E00       mov eax,[$005e419c]
005CE3F4 031C90           add ebx,[eax+edx*4]



Либо я тупой либо компилятор весьма поумнел =D
...
Рейтинг: 0 / 0
Арифметика указателей
    #39627211
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
КодогенераторМде, походу пора переучиваться, прямой перебор бредогенератор дельфи в релиз сборке оптимальнее делает
С включенной оптимизацией 1 вариант
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Unit1.pas.50: LTestValue := LTestValue+ LTestArray[x, y];
005CE317 0318             add ebx,[eax]
Unit1.pas.51: LTestValue := LTestValue+ LTestArray[x-1, y-1];
005CE319 039848FBFFFF     add ebx,[eax-$000004b8]
Unit1.pas.52: LTestValue := LTestValue+ LTestArray[x+1, y+1];
005CE31F 0398B8040000     add ebx,[eax+$000004b8]
Unit1.pas.53: LTestValue := LTestValue+ LTestArray[x+1, y];
005CE325 0398B4040000     add ebx,[eax+$000004b4]
Unit1.pas.54: LTestValue := LTestValue+ LTestArray[x-1, y];
005CE32B 03984CFBFFFF     add ebx,[eax-$000004b4]
Unit1.pas.55: LTestValue := LTestValue+ LTestArray[x, y+1];
005CE331 035804           add ebx,[eax+$04]
Unit1.pas.56: LTestValue := LTestValue+ LTestArray[x, y-1];
005CE334 0358FC           add ebx,[eax-$04]



С включенной оптимизацией 2вариант, аж на одну инструкцию больше для каждого опроса :/
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Unit1.pas.75: LTestValue := LTestValue+ MyCurrentY[x];
005CE3C4 8B06             mov eax,[esi]
005CE3C6 031C90           add ebx,[eax+edx*4]
Unit1.pas.76: LTestValue := LTestValue+ MyPredY[x-1];
005CE3C9 A19C415E00       mov eax,[$005e419c]
005CE3CE 035C90FC         add ebx,[eax+edx*4-$04]
Unit1.pas.77: LTestValue := LTestValue+ MyNextY[x+1];
005CE3D2 A1A0415E00       mov eax,[$005e41a0]
005CE3D7 035C9004         add ebx,[eax+edx*4+$04]
Unit1.pas.78: LTestValue := LTestValue+ MyCurrentY[x+1];
005CE3DB 8B06             mov eax,[esi]
005CE3DD 035C9004         add ebx,[eax+edx*4+$04]
Unit1.pas.79: LTestValue := LTestValue+ MyNextY[x];
005CE3E1 A1A0415E00       mov eax,[$005e41a0]
005CE3E6 031C90           add ebx,[eax+edx*4]
Unit1.pas.80: LTestValue := LTestValue+ MyCurrentY[x-1];
005CE3E9 8B06             mov eax,[esi]
005CE3EB 035C90FC         add ebx,[eax+edx*4-$04]
Unit1.pas.81: LTestValue := LTestValue+ MyPredY[x];
005CE3EF A19C415E00       mov eax,[$005e419c]
005CE3F4 031C90           add ebx,[eax+edx*4]




Либо я тупой либо компилятор весьма поумнел =D
возможны оба варианта
...
Рейтинг: 0 / 0
Арифметика указателей
    #39627695
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая версия 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.
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.
Unit1.pas.41: LSomeTime := GetTickCount64;
005CFCF2 E8854DE4FF       call GetTickCount64
005CFCF7 8945EC           mov [ebp-$14],eax
Unit1.pas.42: for LIterations := 0 to 50000 do
005CFCFA C745F051C30000   mov [ebp-$10],$0000c351
Unit1.pas.44: for y := 0 to 99 do
005CFD01 C745F464000000   mov [ebp-$0c],$00000064
005CFD08 8D858460FFFF     lea eax,[ebp-$00009f7c]
005CFD0E 8945E8           mov [ebp-$18],eax
Unit1.pas.46: MyCurrent := @LTestArray[y];
005CFD11 8B45E8           mov eax,[ebp-$18]
005CFD14 8903             mov [ebx],eax
Unit1.pas.47: MyPred := MyCurrent;
005CFD16 8B03             mov eax,[ebx]
005CFD18 8906             mov [esi],eax
Unit1.pas.48: Dec(MyPred);
005CFD1A 812E94010000     sub [esi],$00000194
Unit1.pas.49: MyNext := MyCurrent;
005CFD20 8B03             mov eax,[ebx]
005CFD22 8907             mov [edi],eax
Unit1.pas.50: Inc(MyNext);
005CFD24 810794010000     add [edi],$00000194
Unit1.pas.51: for x := 0 to 99 do
005CFD2A 33C0             xor eax,eax
Unit1.pas.71: end;
005CFD2C 40               inc eax
Unit1.pas.51: for x := 0 to 99 do
005CFD2D 83F864           cmp eax,$64
005CFD30 75FA             jnz $005cfd2c
Unit1.pas.72: end;
005CFD32 8145E894010000   add [ebp-$18],$00000194
Unit1.pas.44: for y := 0 to 99 do
005CFD39 FF4DF4           dec dword ptr [ebp-$0c]
005CFD3C 75D3             jnz $005cfd11
Unit1.pas.42: for LIterations := 0 to 50000 do
005CFD3E FF4DF0           dec dword ptr [ebp-$10]
005CFD41 75BE             jnz $005cfd01
Unit1.pas.74: Caption := inttostr(GetTickCount64 - LSomeTime);
005CFD43 E8344DE4FF       call GetTickCount64
005CFD48 52               push edx
005CFD49 50               push eax
005CFD4A 8B45EC           mov eax,[ebp-$14]
005CFD4D 99               cdq 
005CFD4E 290424           sub [esp],eax
005CFD51 19542404         sbb [esp+$04],edx
005CFD55 58               pop eax
005CFD56 5A               pop edx
005CFD57 52               push edx
005CFD58 50               push eax
005CFD59 8D858060FFFF     lea eax,[ebp-$00009f80]
005CFD5F E88831E5FF       call IntToStr
005CFD64 8B958060FFFF     mov edx,[ebp-$00009f80]
005CFD6A 8B45FC           mov eax,[ebp-$04]
005CFD6D E8A6C9F4FF       call TControl.SetText
Unit1.pas.75: end;
005CFD72 33C0             xor eax,eax
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Арифметика указателей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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