Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2010, 11:03   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Замена умножения и деления

Код:
X Div Y * Y
На что более быстродейственное это можно заменить?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 05.09.2010, 11:05   #2
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Ну быстрее только ассемблерные вставки... А так разве медленно?
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 05.09.2010, 11:08   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Ну, насколько я помню, умножение и деление - самые медленные действия. Быстрее написать A+A, чем A*2

Кажись, нашел кое-что:
Цитата:
X mod Y = X - (X div Y) * Y.
Т.е.
Цитата:
X mod Y - X = - (X div Y) * Y.
X - (X mod Y) = X div Y * Y
Кажись так, если ничего не напутал...
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ

Последний раз редактировалось Alex Cones; 05.09.2010 в 11:14.
Alex Cones вне форума Ответить с цитированием
Старый 05.09.2010, 11:21   #4
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Цитата:
умножение и деление - самые медленные действия
На самом деле не совсем так. Сложение (вычитание), умножение выполняются очень даже быстро по сравнению с делением (по обстоятельствам раз в 5-15 быстрее).
Надо стараться избегать операции деления)

Вообще я обычно делаю замену z=1/y. и все операции деления превращаются в умножение. Но вот в вашем случае так видимо не получится.
Тут нужно математически оптимизировать )
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
InternetStranger вне форума Ответить с цитированием
Старый 05.09.2010, 11:25   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Не ну если даже так, левая часть уже должна выполнятся быстрее правой:
Код:
X - (X mod Y) = X div Y * Y
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 05.09.2010, 12:37   #6
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
По умолчанию

Не думаю что получится соль нибудь ощутимого прироста. Тут слишком много нюансов. Нужно этот код профилировать непосредственно в программе.

Следующий нехитрый код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var x,y    : integer;
var z,q    : real;
begin
     x:= 1;
     y:= 5;
     z := X - (X mod Y);
     q := X div Y * Y;
     Button1.Caption := FloatToStr( z + q );
end;
компилируется вот в следующие строки. С точки зрения производительности не вижу никаких преимуществ: операция sub "поменялась" на imul (при целочисленных (?) операциях разница будет минимальна)
Alex Cones.jpg

ps: ориентируюсь на опубликованную документацию Intel ( ноябрь 2009 ):
Intel®64 and IA-32 Architectures Optimization Reference Manual
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
InternetStranger вне форума Ответить с цитированием
Старый 05.09.2010, 12:53   #7
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Ну если выдрать код из проекта, то будет так:
Код:
FRMMain.Canvas.Draw(((P.X - Coord.Left) Div CELL_SIZE * CELL_SIZE) + Coord.Left, Coord.Top, BITLight);
P - TPoint
Код:
 TCoordn = Record
  Left   : Integer;
  Top    : Integer;
  Width  : Integer;
  Height : Integer;
 End;
CELL_SIZE - целочисленная константа.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 05.09.2010, 15:53   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Alex Cones Посмотреть сообщение
CELL_SIZE - целочисленная константа.
Случайно, не степень двойки ? Или даже так: нельзя ли изменить код, чтобы это была степень двойки ? Было бы совсем просто: x and not (y-1)
alexBlack вне форума Ответить с цитированием
Старый 05.09.2010, 16:15   #9
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

64 ..............

Но хотелось бы увидеть в асме, как это изменится.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 05.09.2010, 16:42   #10
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

вот это?:

Код:
z := x and not (y-1)

mov ebx, edx  // y
dec  ebx  
not  ebx
and  ebx, eax
или даже так:

Код:
z := x and $FFFFFFC0;

mov  ebx, eax   // x
and  ebx, -$40
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прегерузка оператора умножения. 123er4 Общие вопросы C/C++ 0 13.06.2010 17:11
Таблица умножения Golovastik Общие вопросы C/C++ 18 25.07.2009 23:46
Замена кода программы с Delhi5 на Delhi7 либо замена базы данных с Acessa на MySQL DorianLeroy Фриланс 8 18.02.2009 18:52
таблица умножения в файле kate158 Общие вопросы Delphi 4 18.12.2008 12:51
вывод таблицы умножения Soule Паскаль, Turbo Pascal, PascalABC.NET 3 12.10.2007 11:26