Сейчас на форуме: tyns777, zds, JustLife, 2nd, morgot, Rio (+5 невидимых)

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

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

Создано: 06 июля 2009 16:58 · Поправил: LKS128
· Личное сообщение · #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 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 июля 2009 15:31 · Поправил: multiarc
· Личное сообщение · #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.



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 15 июля 2009 17:59
· Личное сообщение · #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 - будет такая ерунда.
При первом вычислении всё Ок.
И плюс оригинал с исходниками распространяется. ;)




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

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

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

6c3c_16.07.2009_CRACKLAB.rU.tgz - MagicDivider.v1.04.rar

-----
EnJoy!




Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

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

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




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

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

cppasm
собственно алгоритм я не трогал
бага вылезла в ф-ции udw2str из библиотеки masm32, которая в новой версии masm32, не добавляла завершающий 0 в нужном месте.

-----
EnJoy!



<< . 1 . 2 .
 eXeL@B —› Программирование —› Оптимизация (int * int) div int
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати