FreeBasic
Главная
Вход
Регистрация
Суббота, 20.04.2024, 08:06Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Исходники » Умножение (софтвар)
Умножение (софтвар)
haavДата: Суббота, 15.02.2020, 22:28 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Привет всем!

Сначала написал код умножения на чистом FB . После сравнения скорости , я понял , что код - полный аутсайдер (отставание в ~8 раз). Потом , дай думаю перепишу с помощью асмовых вставок и тут уже картина лучше (всего в 3 раза). Код работает на 64х-битной платформе , тестировал под Linux!

Код
function mul naked stdcall(iOne as Long  , iTwo as Long ) as Long

    asm

  xor eax,eax

  m0:
  
  test edi , 1
  
  jz m1
  
  add eax, esi
  
  m1:
  
  shr edi,1
  
  shl esi,1
  
  test edi,edi
  
  jnz m0
  
  ret
  
    End Asm
    
End Function

var t = timer

for i as Long = 1 to 99999999
    
    var w =  mul(55,10)
    'var w =  55*10
    
Next


? Timer -t

sleep


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
DarkDemonДата: Вторник, 18.02.2020, 11:39 | Сообщение # 2
Полковник
Группа: Друзья
Сообщений: 188
Репутация: -2
Статус: Offline
Стас, на вызов процедуры тратится львиная доля времени, тут сам подход измерения неверен.
Правильнее организовывать внешний цикл на ассемблере не используя при этом LOOP, т.е. через JMP условные переходы.
Для умножения на ассемблере есть инструкция mul, там нужно подготовить спец образом регистры.
Простые умножения вида x2, x4, x8, x16 и т.п. делаются банальным сдвигом(shl) всего числа на n бит
деление, соотв. сдвигом обратно(shr). Когда-то во времена первых пентаков это сильно ускоряло код.


Сообщение отредактировал DarkDemon - Вторник, 18.02.2020, 11:40
 
haavДата: Вторник, 18.02.2020, 16:45 | Сообщение # 3
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Привет Леха!

Цитата DarkDemon ()
Стас, на вызов процедуры тратится львиная доля времени


Я тоже так подумал.

Цитата DarkDemon ()
Для умножения на ассемблере есть инструкция mul


так ее и хотелось повторить и наиболее приблизиться по времени к результату ее работы.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
Форум » Freebasic » Исходники » Умножение (софтвар)
  • Страница 1 из 1
  • 1
Поиск: