Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Swap, byte , word , dword 
:(
    Опции темы
Romikgy
Дата 4.8.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Вот решел поэксперементировать с заменой байт, слов , полубайт, 
покритикуйте , если интересно smile
потестировал 3 функции замены байт в слове (2 байта)
Код

function SwapW(x: word):word;
begin
  Result:= x shr 8;
  Result:=Result or (x and $ff) shl 8;
end;

Код

function SwapWa(x: word):word;
begin
    asm
      rol ax,8
      ret
    end;
end;
Код

function SwapWs(x: word):word;
var p1,p2: pbyte;
begin
  p1:=@Result;
  p2:=@x;
  inc(p2);
  p1^:=p2^;
  inc(p1); dec(p2);
  p1^:=p2^;
end;

результаты тестов моих при 50000000 итерациях
Код

And + Or : 2484
Asm : 1122
Pointer : 4276 

А вот и для дворда и байта
Код

function SwapBa(x: byte):byte;
begin
    asm
      rol al,4
      ret
    end;
end;

function SwapWa(x: word):word;
begin
    asm
      rol ax,8
      ret
    end;
end;
function SwapDWa(x: dword):dword;
begin
    asm
      rol ax,8
      rol eax,16
      rol ax,8
      ret
    end;
end;



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
drkot
Дата 4.8.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



молодца.  smile 
в принципе результат логичен.
количество команд в коде и вреся выполнения. 


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
BUGOR
Дата 4.8.2006, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: 5
Всего: 16



Интересная темаsmile

Потестил, интересно, что на моём процессоре(Duron 950) функции SwapWa и SwapW показывают примерно одинаковые результаты, выделить, что быстрее, а что медленнее трудно(средний результат 390-420), при этом функция SwapWs в 4 раза медленнее двух остальных, ну оно и понятно(1700-1800).
Ну зато я нашёл самую быструю для своего процессора функцию, вот:

Код

function SwapWc(x: word):word;
begin
    asm
      xchg al,ah
      ret
    end;
end;


Добавлено @ 14:47 
Вот ещё, чуть медленне всех остальных, кроме Pointer
Код

function SwapWx(x: word):word;
begin
    asm
        xor ah,al
        xor al,ah
        xor ah,al
      ret
    end;
end;



--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
dumb
Дата 4.8.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



Код

function SwapDWa(x: dword):dword; register;
asm
    bswap eax
    ret
end;


время выполнения xchg al,ah = rol ax, 8 = 1

PM MAIL   Вверх
BUGOR
Дата 4.8.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: 5
Всего: 16



Для dword предложенный Romikgy вариант отработал за, в среднем, время = 450.
Однако есть более быстрый вариант, для этого даже есть специальная команда процессора:

Код

function SwapDWa(x: dword):dword;    
begin
    asm
      bswap eax
      ret
    end;
end;


Время, в среднем = 340

Добавлено @ 14:58 
о, уже опередилиsmile

Это сообщение отредактировал(а) BUGOR - 4.8.2006, 14:57


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 4.8.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(BUGOR @  4.8.2006,  13:56 Найти цитируемый пост)
 bswap eax

не знал smile

Добавлено @ 15:06 
только одна мааааленькая трабла
Код

BSWAP - Byte Swap       (486+)

        Usage:  BSWAP   reg32
        Modifies flags: none

        Changes the byte order of a 32 bit register from big endian to
        little endian or vice versa.   Result left in destination register
        is undefined if the operand is a 16 bit register.

                                 Clocks                 Size
        Operands         808x  286   386   486          Bytes

        reg32             -     -     -     1             2

это код будет работать для процов от 486 и выше, хотя их щаз уже мало , но мало ли что бывает в жизни smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Snowy
Дата 4.8.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



А вы мне случайно не подскажите, а какова цель данной затеи?
ЗЫ. Вы еще процедуру начните убирать - инлайновой вставкой делайте - ещё быстрее будет.
Только смысл?
PM MAIL   Вверх
Romikgy
Дата 4.8.2006, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(Snowy @  4.8.2006,  14:11 Найти цитируемый пост)
Только смысл?

Имхо не сильно велик , но где можно сделать оптимальнее и быстрее я стараюсь так и сделать smile

Цитата(Snowy @  4.8.2006,  14:11 Найти цитируемый пост)
 инлайновой вставкой делайте

конечно только если код будет ооооооочень много раз повторятся , то и размер приложения будет возврастать smile имхо нужна золотая середина smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
dumb
Дата 4.8.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



кстати, для таких функций инлайн - самое оно. экономия и размера и времени. user posted image
PM MAIL   Вверх
Romikgy
Дата 4.8.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(dumb @  4.8.2006,  14:35 Найти цитируемый пост)
 времени.

да 
Цитата(dumb @  4.8.2006,  14:35 Найти цитируемый пост)
размера

нет

Цитата(dumb @  4.8.2006,  13:55 Найти цитируемый пост)
время выполнения xchg al,ah = rol ax, 8 = 1

Код

XCHG - Exchange

        Usage:  XCHG    dest,src
        Modifies flags: None

        Exchanges contents of source and destination.

                                 Clocks                 Size
        Operands         808x  286   386   486          Bytes

        reg,reg           4     3     3     [B]3 [/B]            2
        mem,reg         17+EA   5     5     5            2-4  (W88=25+EA)
        reg,mem         17+EA   5     5     3            2-4  (W88=25+EA)
        accum,reg         3     3     3     3             1
        reg,accum         3     3     3     3             1

Код

ROL - Rotate Left

        Usage:  ROL     dest,count
        Modifies flags: CF OF

        +-+     +---------------+
        |C|<-+--|7 <---------- 0|<-+
        +-+  |  +---------------+  |
             +---------------------+

        Rotates the bits in the destination to the left count times with
        all data pushed out the left side re-entering on the right.  The
        Carry Flag will contain the value of the last bit rotated out.

                                 Clocks                 Size
        Operands         808x  286   386   486          Bytes

        reg,1             2     2     3     3             2
        mem,1           15+EA   7     7     4            2-4  (W88=23+EA)
        reg,CL           8+4n  5+n    3     3             2
        mem,CL        20+EA+4n 8+n    7     4            2-4  (W88=28+EA+4n)
        reg,immed8        -    5+n    3     [B]2 [/B]            3
        mem,immed8        -    8+n    7     4            3-5

т.е. rol быстрее


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
BUGOR
Дата 4.8.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 12.3.2006

Репутация: 5
Всего: 16



Я конечно могу ошибаться, но имхо со времен 486 архитектура этих команд и кол-во тактов изменилось, к тому же это зависит от очень многих факторов, на васме давно обсуждалась эта тема, там развернулся спор на десяток страниц и пришли к выводу, что сказать однозначно за сколько тактов будет выполнен тот или иной участок кода практически невозможно, поэтому если тут разница в такт между двумя командами, то на практике это может быть совсем иначе, ибо команды эти выполняются в совокупности с множеством других, к тому же, если я не ошибаюсь, скорость выполнения так же будет очень сильно зависеть от состояния кэша, а так же от самого процессора(я имею ввиду не характеристики, а архитектуру)... если ошибаюсь, поправьте.

Это сообщение отредактировал(а) BUGOR - 4.8.2006, 16:19


--------------------
Живу недоумевая, всё время хочу понять...
http://hunger.ru 
PM MAIL WWW ICQ   Вверх
dumb
Дата 4.8.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



Romikgy,
для "голой функции" (в твоем варианте она еще стабы поимеет):

Код

5. mov eax, xxx
5. call Swap
3.     rol ax, 8
1.     ret
= 14


Код

5. mov eax, xxx
3. rol ax, 8
= 8


экономишь на call + ret (+stubs)

ты б еще для 286 тайминги взял! user posted image

edit: забыл "адресовать" сообщение... user posted image


Это сообщение отредактировал(а) dumb - 4.8.2006, 16:24
PM MAIL   Вверх
Romikgy
Дата 4.8.2006, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(dumb @  4.8.2006,  15:22 Найти цитируемый пост)
экономишь на call + ret (+stubs)ты б еще для 286 тайминги взял! edit: забыл "адресовать" сообщение... 

дык юзаются же еще и 286 smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1037 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.