|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.06.2010, 21:21 | #1 |
Trust no one.
Старожил
Регистрация: 07.04.2009
Сообщений: 6,526
|
Оптимизация функции с "<" и ">"
Мож^WКак оптимизировать следующую функцию?
Код:
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ |
03.06.2010, 21:31 | #2 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Что вы имеете в виду под - оптимизировать? Сократить код или уменьшить время выполнения?
|
03.06.2010, 21:39 | #3 |
Trust no one.
Старожил
Регистрация: 07.04.2009
Сообщений: 6,526
|
Разумеется уменьшить время.
Как внутри маш. кода происходит > и <? Может анализируя это можно провести оптимизацию?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ |
03.06.2010, 21:43 | #4 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Ну для начала
Код:
|
03.06.2010, 21:44 | #5 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
03.06.2010, 22:20 | #6 |
Тот ещё
Старожил
Регистрация: 14.11.2007
Сообщений: 2,242
|
Код:
|
04.06.2010, 07:27 | #7 |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Сам IF истинное условие выполняет быстрей, чем ложное, постарайся сделать так, чтобы истинное условие наступало чаще. Можно попытаться перестроить выражения через математические операции, или через сравнение с константой (например, если самое меньшее число принять за нуль)
и сравнить время выполнения (например, в цикле на миллион сравнений). Например: Код:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика Последний раз редактировалось Utkin; 04.06.2010 в 07:34. |
04.06.2010, 07:42 | #8 |
Форумчанин
Регистрация: 25.07.2009
Сообщений: 533
|
Сделать Вложенные if и отказаться от and.
Function InRect(X, Y, X1, Y1, X2, Y2 : Integer) : Boolean; Begin Result := False; If (X>X1) then if (X<X2) then if (Y>Y1) then if (Y<Y2) then Result := TRUE; end; Итак что происходит при таком варианте написания. Как только не выполняется хотя бы одно условие программа выходит из этой процедуры. Т.е. если не выполняется 1 условие то на все остальные программа даже не тратит ресурсы системы. А в твоем варианте с and ты обрекаешь программу на проверку всех 4 условий.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA) |
04.06.2010, 07:53 | #9 | |
Старожил
Регистрация: 04.02.2009
Сообщений: 17,351
|
Цитата:
Маньяк-самоучка
Utkin появился в результате деления на нуль. Осторожно! Альтернативная логика |
|
04.06.2010, 08:42 | #10 |
Форумчанин
Регистрация: 25.07.2009
Сообщений: 533
|
Ну да есть такая кухня.
Вот для потестить. program rdtsc_view; {$APPTYPE CONSOLE} uses SysUtils, windows; Function InRectO(X, Y, X1, Y1, X2, Y2 : Integer) : Boolean; Begin If (X>X1) And (X<X2) And (Y>Y1) And (Y<Y2) Then Result := TRUE Else Result := FALSE; End; Function InRectM(X, Y, X1, Y1, X2, Y2 : Integer) : Boolean; Begin Result := False; If (X>X1) then if (X<X2) then if (Y>Y1) then if (Y<Y2) then Result := TRUE; end; function tsc: Int64; var ts: record case byte of 1: (count: Int64); 2: (b, a: cardinal); end; begin asm db $F; db $31; mov [ts.a], edx mov [ts.b], eax end; tsc:=ts.count; end; function calibrate_runtime:Int64; var i:byte; tstsc,tetsc,crtm:Int64; begin tstsc:=tsc; crtm:=tsc-tstsc; for i:=0 to 9 do begin tstsc:=tsc; crtm:=tsc-tstsc; if tetsc<crtm then crtm:=tetsc; end; calibrate_runtime:=crtm; end; var St,En,Tm,Tm1:Int64; I:Integer; begin for I := 0 to 9 do begin Writeln('Parameters | Orig | Modify '); St:= tsc; InRectO(0,50,50,0,25,25); En:= tsc; Tm:=En-St; St:= tsc; InRectM(0,50,50,0,25,25); En:= tsc; Tm1:=En-St; Writeln('InRect(0,50,50,0,25,25) | '+IntToStr(Tm)+' | '+IntToStr(Tm1)); St:= tsc; InRectO(100,100,80,50,120,140); En:= tsc; Tm:=En-St; St:= tsc; InRectM(100,100,80,50,120,140); En:= tsc; Tm1:=En-St; Writeln('InRect(100,100,80,50,120,1 40) | '+IntToStr(Tm)+' | '+IntToStr(Tm1)); St:= tsc; InRectO(80,100,80,50,40,140); En:= tsc; Tm:=En-St; St:= tsc; InRectM(80,100,80,50,40,140); En:= tsc; Tm1:=En-St; Writeln('InRect(80,100,80,50,40,140 ) | '+IntToStr(Tm)+' | '+IntToStr(Tm1)); St:= tsc; InRectO(150,50,50,0,225,125); En:= tsc; Tm:=En-St; St:= tsc; InRectM(150,50,50,0,225,125); En:= tsc; Tm1:=En-St; Writeln('InRect(150,50,50,0,225,125 ) | '+IntToStr(Tm)+' | '+IntToStr(Tm1)); end; Readln; end.
Маразм крепчал. Еноты пели...
R-style Dataknowlege Access Member Account (RDAMA) |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как обойти "преобразование типа из "string" в "float" невозможно" | lexluter1988 | Помощь студентам | 1 | 07.08.2010 12:23 |
DebugAPI перехват функции "на" и "после" | Cj_ | Win Api | 1 | 20.04.2010 01:11 |
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. | Каравай | Microsoft Office Excel | 13 | 17.02.2010 09:53 |
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" | aleksei78 | Microsoft Office Excel | 13 | 25.08.2009 12:04 |