Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2018.06.03;
Скачать: [xml.tar.bz2];

Вниз

Можно ли ускорить функцию?   Найти похожие ветки 

 
Rouse_ ©   (2016-05-31 20:55) [40]

Эммм... дык там же вообще практически на коленке пишется без извращений с оптимизацией...

Выложи исходники, где там у тебя 2 часа думает и ТЗ само.


 
SergP ©   (2016-05-31 22:25) [41]


> Rouse_ ©   (31.05.16 20:55) [40]
>
> Эммм... дык там же вообще практически на коленке пишется
> без извращений с оптимизацией...
>


Хм. ты так уверен?


> Выложи исходники, где там у тебя 2 часа думает и ТЗ само.


На домашнем компе щас нет Дельфи. А исходники нужно еще привести в более-менее нормальный вид, и снабдить нормальными коментариями, ибо разобраться будет трудно. Завтра приведу в более-менее пригодный вид и выложу, желательно на мыло. просто довольно большой, 1.5 тысячи строк. Да еще и тестовые примеры нужно прицепить...

А насчет 2 часов - уже конечно во много раз быстрее, но тем не менее памяти жрет порядочно. Пока бывали ситуации когда по 60 мб под массивы сжирало.

ЗЫ Я поначалу думал что просто будет, перепробовал несколько вариантов представления данных, но остановился на последнем.
Когда писал программу для обычного сапера - то там все расчеты производились моментально, в процессе модификации исходных данных, т.е. даже не нужна была отдельная кнопка для запуска расчета, даже при тех данных, когда найденная в интернете подобная программа для обычного сапера, (которая в большинстве случаев тоже довольно быстро все просчитывала) была мной поставлена в тупик одним из вариантов исходных данных, когда она сказала что ждать конца расчетов осталось около 72 тыс. часов, т.е. около 9 лет.


 
SergP ©   (2016-06-01 14:32) [42]


> Rouse_ ©   (31.05.16 20:55) [40]
>
> Эммм... дык там же вообще практически на коленке пишется
> без извращений с оптимизацией...
>
> Выложи исходники, где там у тебя 2 часа думает и ТЗ само.
>


отправил на мыло, которое тут на сайте указано.


 
Rouse_ ©   (2016-06-01 14:41) [43]

угу, вечерком гляну


 
SergP ©   (2016-06-01 18:56) [44]

Вот думаю, может попробовать представить это все в виде системы линейных уравнений, и решать по принципу метода Гаусса?...


 
SergP ©   (2016-06-01 19:00) [45]


> SergP ©   (01.06.16 18:56) [44]
>
> Вот думаю, может попробовать представить это все в виде
> системы линейных уравнений, и решать по принципу метода
> Гаусса?...


Хотя так тоже свои проблемы будут. Например как учесть то условие, что количество переменных уравнения имеющих значение 3 может быть не более двух, 2 не более четырех и 1 не более пяти?


 
SergP ©   (2016-06-21 08:31) [46]

Почти переписал все на ассемблере, значительно изменивши (счетчиков циклов там уже нет, осталось только 3 последовательных (не вложенных) цикла где не используются счетчики, ну и удалось задействовать табличные данные для удобства и ускорения (размером 2 кб). Не тестировал еще, так как находясь в больнице заниматься этим проблематично, в основном думать приходится используя тетрадь и ручку.
Только вот возник вопрос: Как вот эту часть там оформить?
 ... raise Exception.Create("Error GetEntrance");
?

В дизасемблированном виде оно выглядит так (без строки: "Error GetEntrance")

:00461C66 B98C1C4600              mov ecx, 00461C8C
:00461C6B B201                    mov dl, 01
:00461C6D A1146E4000              mov eax, dword ptr [00406E14]
:00461C72 E82D98FAFF              call 0040B4A4
:00461C77 E8741CFAFF              call 004038F0


Первая строчка это собственно загрузка адреса строки "Error GetEntrance"

что означают вторая и третяя строчки. А также где мне взять адреса єтих двух подпрограмм?


 
Rouse_ ©   (2016-06-21 11:44) [47]

call Exception.Create
call @RaiseExcept


 
SergP ©   (2016-06-21 18:48) [48]

а как быть с этим?

> :00461C6D A1146E4000              mov eax, dword ptr [00406E14]


 
Rouse_ ©   (2016-06-21 19:34) [49]

да сделай отдельную процедуру куда напиши

raise Exception.Create("Error GetEntrance");

и вызывай ее - че мучаться то?


 
SergP ©   (2016-06-22 15:48) [50]

И то правда... Как-то сразу не подумал об этом.

В результате получилась такая функция: (не знаю насколько сама функция теперь быстрее работает чем вариант Sha, но вся программа тестовый пример посчитала за 1м 44с вместо 4м 42с)

function GetEntrance(var BigSource, SmallSource: Twork): Twork;
 procedure ErrorRaiseException;
 begin
   raise Exception.Create("Error GetEntrance");
 end;
asm
         push ebx
         push esi
         push edi
         push ebp

         xor  ebp,ebp
         mov  ebx,[edx]
         xor  ebx,[eax]
         mov  [ecx],ebx
         jz   @nobit0
@cntbit0: lea  esi,[ebx-1]
         inc  ebp
         and  ebx,esi
         jnz  @cntbit0
@nobit0:  mov  ebx,[edx+$04]
         xor  ebx,[eax+$04]
         mov  [ecx+$04],ebx
         jz   @nobit1
@cntbit1: lea  esi,[ebx-1]
         inc  ebp
         and  ebx,esi
         jnz  @cntbit1
@nobit1:

         lea  edi,[ecx+$08]
         lea  esi,[edx+$08]
         mov  edx,[eax+$10]
         push edx
         mov  edx,[eax+$0C]
         push edx
         mov  edx,[eax+$08]
         push edx
         xor  edx,edx
         push edx
         push edx
         push edx
         push eax
         mov  [ecx+$08],edx
         mov  [ecx+$0C],edx
         mov  [ecx+$10],edx

         mov eax,ebp
         cmp  eax,11  // êîë-âî ÿ÷ååê áîëåå 11 âëèÿåò òàê æå êàê 11
         js  @next
         mov  eax,11
@next:    add  eax,4

         xchg edx,[esi]
@bgns0a:  bsf  ecx,edx
         jz  @ns0ex
@bgns0b:  btr  edx,ecx
         lea  ebp,[ecx*8]
         lea  ebp,[eax+ebp*2]
         lea  ebp,[ebp*4+GentArr]
@_ns0b0:  mov  ebx,[ebp]
         and  ebx,[esp+$10]
         jz   @ns0b1
         bts  [esi],ecx
         or   [esp+$04],ebx
         shr  ebx,cl
         or   [edi],ebx
@ns0b1:   mov  ebx,[ebp-$04]
         and  ebx,[esp+$14]
         jz   @ns0b2
         bts  [esi],ecx
         or   [esp+$08],ebx
         shr  ebx,cl
         or   [edi+$04],ebx
@ns0b2:   mov  ebx,[ebp-$08]
         and  ebx,[esp+$18]
         jz   @bgns0a
         bts  [esi],ecx
         or   [esp+$0C],ebx
         shr  ebx,cl
         or   [edi+$08],ebx
         bsf  ecx,edx
         jnz   @bgns0b

@ns0ex:   xor  edx,edx
         xchg edx,[esi+$04]
@bgns1a:  bsf  ecx,edx
         jz  @ns1ex
@bgns1b:  btr  edx,ecx
         lea  ebp,[ecx*8]
         lea  ebp,[eax+ebp*2]
         lea  ebp,[ebp*4+GentArr]
@_ns1b1:  mov  ebx,[ebp]
         and  ebx,[esp+$14]
         jz   @ns1b2
         bts  [esi+$04],ecx
         or   [esp+$08],ebx
         shr  ebx,cl
         or   [edi],ebx
@ns1b2:   mov  ebx,[ebp-$04]
         and  ebx,[esp+$18]
         jz   @bgns1a
         bts  [esi+$04],ecx
         or   [esp+$0C],ebx
         shr  ebx,cl
         or   [edi+$04],ebx
         bsf  ecx,edx
         jnz   @bgns1b

@ns1ex:   xor  edx,edx
         xchg edx,[esi+$08]
@bgns2a:  bsf  ecx,edx
         jz  @ns2ex
@bgns2b:  btr  edx,ecx
         lea  ebp,[ecx*8]
         lea  ebp,[eax+ebp*2]
         lea  ebp,[ebp*4+GentArr]
@_ns2b2:  mov  ebx,[ebp]
         and  ebx,[esp+$18]
         jz   @bgns2a
         bts  [esi+$08],ecx
         or   [esp+$0C],ebx
         shr  ebx,cl
         or   [edi],ebx
         bsf  ecx,edx
         jnz   @bgns2b
@ns2ex:
         pop  eax
         pop  edx
         mov  [eax+$08],edx
         pop  edx
         mov  [eax+$0C],edx
         pop  edx
         mov  [eax+$10],edx
         add  esp,12    // пропускаем 3 числа засунутые в стек, которые нам уже не нужны
         mov  eax,[edi]
         or   eax,[edi+$04]
         or   eax,[edi+$08]
         jnz  @noraise
         call ErrorRaiseException
@noraise: pop  ebp
         pop  edi
         pop  esi
         pop  ebx          
end;

Теоретически возможности для дальнейшей оптимизации должны иметься. Например более правильно использовать регистры, может где можно добиться спаривания. Хотя думаю что на этом можно и остановиться.


 
SergP ©   (2016-06-22 15:49) [51]

А. ну там еще табличные данные есть
const
GentArr:packed array[0..29,0..15] of integer=(
(0,0,0,0,$00000001,$00000043,$000010C7,$000431CF,$010C73DF,$031CF7FF,$073DFFFF,$ 0F7FFFFF,$1FFFFFFF,$3FFFFFFF,$3FFFFFFF,$3FFFFFFF),
(0,0,0,0,$00000002,$00000086,$0000218E,$0008639E,$0218E7BE,$0639EFBE,$0E7BEFBE,$ 1EFBEFBE,$3EFBEFBE,$3EFBEFBE,$3EFBEFBE,$3EFBEFBE),
(0,0,0,0,$00000004,$0000010C,$0000431C,$0010C73C,$0431CF3C,$0C73CF3C,$1CF3CF3C,$ 3CF3CF3C,$3CF3CF3C,$3CF3CF3C,$3CF3CF3C,$3CF3CF3C),
(0,0,0,0,$00000008,$00000218,$00008638,$00218E38,$08638E38,$18E38E38,$38E38E38,$ 38E38E38,$38E38E38,$38E38E38,$38E38E38,$38E38E38),
(0,0,0,0,$00000010,$00000430,$00010C30,$00430C30,$10C30C30,$30C30C30,$30C30C30,$ 30C30C30,$30C30C30,$30C30C30,$30C30C30,$30C30C30),
(0,0,0,0,$00000020,$00000820,$00020820,$00820820,$20820820,$20820820,$20820820,$ 20820820,$20820820,$20820820,$20820820,$20820820),
(0,0,0,0,$00000040,$000010C0,$000431C0,$010C73C0,$031CF7C0,$073DFFC0,$0F7FFFC0,$ 1FFFFFC0,$3FFFFFC0,$3FFFFFC0,$3FFFFFC0,$3FFFFFC0),
(0,0,0,0,$00000080,$00002180,$00086380,$0218E780,$0639EF80,$0E7BEF80,$1EFBEF80,$ 3EFBEF80,$3EFBEF80,$3EFBEF80,$3EFBEF80,$3EFBEF80),
(0,0,0,0,$00000100,$00004300,$0010C700,$0431CF00,$0C73CF00,$1CF3CF00,$3CF3CF00,$ 3CF3CF00,$3CF3CF00,$3CF3CF00,$3CF3CF00,$3CF3CF00),
(0,0,0,0,$00000200,$00008600,$00218E00,$08638E00,$18E38E00,$38E38E00,$38E38E00,$ 38E38E00,$38E38E00,$38E38E00,$38E38E00,$38E38E00),
(0,0,0,0,$00000400,$00010C00,$00430C00,$10C30C00,$30C30C00,$30C30C00,$30C30C00,$ 30C30C00,$30C30C00,$30C30C00,$30C30C00,$30C30C00),
(0,0,0,0,$00000800,$00020800,$00820800,$20820800,$20820800,$20820800,$20820800,$ 20820800,$20820800,$20820800,$20820800,$20820800),
(0,0,0,0,$00001000,$00043000,$010C7000,$031CF000,$073DF000,$0F7FF000,$1FFFF000,$ 3FFFF000,$3FFFF000,$3FFFF000,$3FFFF000,$3FFFF000),
(0,0,0,0,$00002000,$00086000,$0218E000,$0639E000,$0E7BE000,$1EFBE000,$3EFBE000,$ 3EFBE000,$3EFBE000,$3EFBE000,$3EFBE000,$3EFBE000),
(0,0,0,0,$00004000,$0010C000,$0431C000,$0C73C000,$1CF3C000,$3CF3C000,$3CF3C000,$ 3CF3C000,$3CF3C000,$3CF3C000,$3CF3C000,$3CF3C000),
(0,0,0,0,$00008000,$00218000,$08638000,$18E38000,$38E38000,$38E38000,$38E38000,$ 38E38000,$38E38000,$38E38000,$38E38000,$38E38000),
(0,0,0,0,$00010000,$00430000,$10C30000,$30C30000,$30C30000,$30C30000,$30C30000,$ 30C30000,$30C30000,$30C30000,$30C30000,$30C30000),
(0,0,0,0,$00020000,$00820000,$20820000,$20820000,$20820000,$20820000,$20820000,$ 20820000,$20820000,$20820000,$20820000,$20820000),
(0,0,0,0,$00040000,$010C0000,$031C0000,$073C0000,$0F7C0000,$1FFC0000,$3FFC0000,$ 3FFC0000,$3FFC0000,$3FFC0000,$3FFC0000,$3FFC0000),
(0,0,0,0,$00080000,$02180000,$06380000,$0E780000,$1EF80000,$3EF80000,$3EF80000,$ 3EF80000,$3EF80000,$3EF80000,$3EF80000,$3EF80000),
(0,0,0,0,$00100000,$04300000,$0C700000,$1CF00000,$3CF00000,$3CF00000,$3CF00000,$ 3CF00000,$3CF00000,$3CF00000,$3CF00000,$3CF00000),
(0,0,0,0,$00200000,$08600000,$18E00000,$38E00000,$38E00000,$38E00000,$38E00000,$ 38E00000,$38E00000,$38E00000,$38E00000,$38E00000),
(0,0,0,0,$00400000,$10C00000,$30C00000,$30C00000,$30C00000,$30C00000,$30C00000,$ 30C00000,$30C00000,$30C00000,$30C00000,$30C00000),
(0,0,0,0,$00800000,$20800000,$20800000,$20800000,$20800000,$20800000,$20800000,$ 20800000,$20800000,$20800000,$20800000,$20800000),
(0,0,0,0,$01000000,$03000000,$07000000,$0F000000,$1F000000,$3F000000,$3F000000,$ 3F000000,$3F000000,$3F000000,$3F000000,$3F000000),
(0,0,0,0,$02000000,$06000000,$0E000000,$1E000000,$3E000000,$3E000000,$3E000000,$ 3E000000,$3E000000,$3E000000,$3E000000,$3E000000),
(0,0,0,0,$04000000,$0C000000,$1C000000,$3C000000,$3C000000,$3C000000,$3C000000,$ 3C000000,$3C000000,$3C000000,$3C000000,$3C000000),
(0,0,0,0,$08000000,$18000000,$38000000,$38000000,$38000000,$38000000,$38000000,$ 38000000,$38000000,$38000000,$38000000,$38000000),
(0,0,0,0,$10000000,$30000000,$30000000,$30000000,$30000000,$30000000,$30000000,$ 30000000,$30000000,$30000000,$30000000,$30000000),
(0,0,0,0,$20000000,$20000000,$20000000,$20000000,$20000000,$20000000,$20000000,$ 20000000,$20000000,$20000000,$20000000,$20000000));



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2018.06.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.003 c
2-1467285403
Andrey K
2016-06-30 14:16
2018.06.03
Как принудительно запустить обработчик CustomDrawItem у TreeView


2-1467023738
Andrey K
2016-06-27 13:35
2018.06.03
Как в TTreeView компоненту присвоить свой идентификатор.


2-1464279405
SergP
2016-05-26 19:16
2018.06.03
Можно ли ускорить функцию?


2-1466529349
Иван Петров
2016-06-21 20:15
2018.06.03
Как узнать сколько байт в памяти занимает TreeView.Items[n].Data?


2-1464811976
Михалыч
2016-06-01 23:12
2018.06.03
JSON не определено





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский