Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  01:20[Войти] | [Зарегистрироваться]
Ответ на вопрос № 40202

21-02-2006 07:01
Здравствуйте, все жители.

Вопрос такой: есть понятия "прямой" и "обратный" порядок байт. Как их переставить местами, скажем для типа Integer. Т.е. 1-й байт должен стоять на 4-месте и т.д. Swap для Integer не помогает.

Я подумал, написал вот это:
function Invert(Value: integer): integer;
var src: array[0..3] of byte absolute Value;
    dst: array[0..3] of byte absolute Result;
begin
  dst[0] := src[3]; dst[1] := src[2];
  dst[2] := src[1]; dst[3] := src[0];
end;

но насколько это правильно и быстро?
Есть ли возможность сделать это по другому, может быть быстрее?

Спасибо

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

28-04-2006 12:22
»вопрос КС №36581«, »вопрос КС №36673«.
А вообще, вы можете запускать одну процедуру не один, а несколько раз. Например,
OldTime:=GetTickCount;
For I:=1 to 1000000 do Z:=Func(...);
ShowMessage(inttostr(GetTickCount-OldTme));
Это сколько времени потрачено на миллион вызовов. Конечно, это число можно варьировать.

22-02-2006 09:47 | Сообщение от автора вопроса
Всем спасибо, думаю я воспользуюсь вариантом Noskov'ова.

22-02-2006 05:43
IntToStr(GetTickCount-n) всегда дает 0, причем для всех примеров. Означает ли это, что все они работают одинаково быстро?
Это значит, что для измерения столь малых промежутков времени ни GetTickCount, ни PerfomanceCounters не подходят, единственный способ, это мерить такты процессора:

function RDTSC:Int64;
asm
  rdtsc;
end;


И что получается - код предложенный мной выполняется в 4 операции, а Маратом Сафиным - в 7. Означает ли это что мой код быстрее?
Это ничего не означает пока не задан конкретный процессор. Процессоры могут выполнять как несколько операций за такт, так и тратить несколько тактов на одну операцию.
Вот это почитайте:
http://www.fastcode.dk/fastcodeproject/basmforbeginners/BASMForBeginners1.htm

22-02-2006 03:46 | Сообщение от автора вопроса
Всем большое спасибо.

Я тут нашел еще один способ, протестировал все (в том числе свой), посмотрел как это выглядит на асемблере, вот что у меня получилось:

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function EndianLong(L: Integer):Integer;
begin
  Result := Swap(L shr 16) OR (Integer(Swap(L and $ffff)) shl 16);
{
mov edx,eax
shr edx,$10
xchg dl,dh
and eax,$0000ffff
xchg al,ah
shl eax,$10
or edx,eax
mov eax,edx
}
end;

procedure TForm1.Button1Click(Sender: TObject);
var n,l: integer;
begin
  l := 1000;
  n := GetTickCount;
  l := EndianLong(l);
  ShowMessage(IntToStr(GetTickCount-n) + ' 1000 : '+IntToStr(l));
end;

function Invert(Value: integer): integer;
var src: array[0..1] of smallint absolute Value;
    dst: array[0..1] of smallint absolute Result;
begin
  dst[0] := Swap(src[1]); dst[1] := Swap(src[0]);
{
mov ax,[ebp-$02]
xchg al,ah
mov [ebp-$08],ax
mov ax,[ebp-$04]
xchg al,ah
mov [ebp-$06},ax
mov eax,[ebp-$08]
}
end;

procedure TForm1.Button2Click(Sender: TObject);
var n,l: integer;
begin
  l := 1000;
  n := GetTickCount;
  l := Invert(l);
  ShowMessage(IntToStr(GetTickCount-n) + ' 1000 : '+IntToStr(l));
end;

function SwapInt(X: integer): integer; assembler;
asm
  bswap eax
{
здесь понятно
}
end;

procedure TForm1.Button3Click(Sender: TObject);
var n,l: integer;
begin
  l := 1000;
  n := GetTickCount;
  l := SwapInt(l);
  ShowMessage(IntToStr(GetTickCount-n) + ' 1000 : '+IntToStr(l));
end;

function Invert2(Value: integer): integer;
var src: array[0..3] of byte absolute Value;
    dst: array[0..3] of byte absolute Result;
begin
  dst[0] := src[3]; dst[1] := src[2];
  dst[2] := src[1]; dst[3] := src[0];
{
mov al,[ebp-$01]
mov [ebp-$08],al
mov al,[ebp-$02]
mov [ebp-$07],al
}
end;

procedure TForm1.Button4Click(Sender: TObject);
var n,l: integer;
begin
  l := 1000;
  n := GetTickCount;
  l := Invert2(l);
  ShowMessage(IntToStr(GetTickCount-n) + ' 1000 : '+IntToStr(l));
end;

end.

В фигурных скобках привожу асемблерный код. Бесспорным лидером конечно является 3 вариант, за что Noskov большое спасибо.
Но я, как человек далекий от асемблера, хотел бы выяснить следующее:
IntToStr(GetTickCount-n) всегда дает 0, причем для всех примеров. Означает ли это, что все они работают одинаково быстро?
И что получается - код предложенный мной выполняется в 4 операции, а Маратом Сафиным - в 7. Означает ли это что мой код быстрее?

21-02-2006 08:11
Быстрее наверно только на асемблере

function SwapInt(X: integer): integer; assembler;
asm
  bswap eax
end;


21-02-2006 07:41
А что если так.

function Invert(Value: integer): integer;
var src: array[0..1] of smallint absolute Value;
    dst: array[0..1] of smallint absolute Result;
begin
  dst[0] := Swap(src[1]); dst[1] := Swap(src[0]);
end;


Быстрее наверно только на асемблере.

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Кто съел Красную шапочку?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования