eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
обновлён 2 декабря!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: Nihil enim (+3 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Программирование —› Оптимизация (int * int) div int
<< . 1 . 2 .
Посл.ответ Сообщение

Ранг: 8.6 (гость)
Статус: Участник

Создано: 6 июля 2009 16:58 · Поправил: LKS128 New!
Цитата · Личное сообщение · #1

Имеется процедура написанная на дельфях.
Общий вид:

Code:
  1. procedure foo;
  2. var i,:integer;
  3. begin
  4.   // ... code
  5.  
  6.   i := (* j) div 255;
  7.  
  8.   // ... code
  9. end;


i := (i * j) div 255;
Эта операция жрёт половину времени процедуры.

Замена на i := round((i * j) / 255);
немного улучшает ситуацию, но не намного.

Есть ли какие-нибудь варианты оптимизации?


Ранг: 58.1 (постоянный)
Статус: Участник

Создано: 14 июля 2009 15:31 · Поправил: multiarc New!
Цитата · Личное сообщение · #2

Вот например как можно умножить быстро int на int (пример для умножения на 34)
Code:
  1. mov eax,int1
  2. mov edx,eax
  3. shl eax, 1
  4. shl edx, 5
  5. add eax,edx
  6. mov res,eax

фактически мы просто умножаем по частям, сначала на 32, потом на 34-32, т.е. 2.
для любого другого числа просто можно посмотреть какие выставлены биты и по похожей технике умножать на любое число, т.е. любой int.

Ранг: 239.1 (наставник)
Статус: Участник

Создано: 15 июля 2009 17:59 New!
Цитата · Личное сообщение · #3

Jupiter пишет:
прилагаю тулзу Magic Divider, созданную The Svin
(я эту тулзу малость причесал)

Кстати рекомендую использовать оригинальную утилиту от The Svin.
Не знаю что там Jupiter правил кроме интерфейса, но результаты правленный вариант выдаёт неправильные в отличии от оригинала.
Деление на 10.
The Svin version:
Code:
  1. MagicNumber = 3435973837
  2. mov eax,X
  3. mov edx, MagicNumber
  4. mul edx
  5. SHR edx, 3


Jupiter version:
Code:
  1. MagicNumber = CCCCCCCDh
  2. mov      eax,X
  3. mov      edx,MagicNumber
  4. mul      edx
  5. shr      edx,33

Это если ввести вначале делитель 10000, а потом делитель 10 - будет такая ерунда.
При первом вычислении всё Ок.
И плюс оригинал с исходниками распространяется. ;)


Ранг: 601.2 (!)
Статус: Модератор
Research & Development

Создано: 16 июля 2009 10:25 New!
Цитата · Личное сообщение · #4

cppasm
спасиб за отчёт, баг поправил

{ Атач доступен только для участников форума } - MagicDivider.v1.04.rar

Ранг: 239.1 (наставник)
Статус: Участник

Создано: 17 июля 2009 10:36 New!
Цитата · Личное сообщение · #5

Да, сейчас всё ок.
Кстати, если уж развивать утилиту, было бы неплохо добавить вариант для знакового деления.
Сейчас код и магические константы генерируются для беззнакового деления.


Ранг: 601.2 (!)
Статус: Модератор
Research & Development

Создано: 17 июля 2009 10:45 New!
Цитата · Личное сообщение · #6

cppasm
собственно алгоритм я не трогал
бага вылезла в ф-ции udw2str из библиотеки masm32, которая в новой версии masm32, не добавляла завершающий 0 в нужном месте.
<< . 1 . 2 .
 eXeL@B —› Программирование —› Оптимизация (int * int) div int

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS