Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Два байта в одно число [D7, XP]


Who_are_you? ©   (2014-06-13 16:59:00) 

Подскажите, пожалуйста, как быстрее для компа объединить два байта в одно число.

Я делаю так:
       // два байта в Word без преобразований
function TForm1.conv2Byte_Word(Byte_L :byte; Byte_H :byte) :Word;
var
 www    :Word;  //временная переменная

Begin
 asm            // Word  в  два байта
   PUSH  CX
   MOV   CX,0
   MOV   CL,Byte_L
   MOV   CH,Byte_H
   MOV   www,CX
   POP   CX
 end;
 conv2Byte_Word:=www;
END;

На сколько будет быстрее, если не подпрограммой, а использовать текст.
Обращаюсь более 32000раз.


Who_are_you?   (2014-06-17 11:46:00) [1]

По вопросу темы все ясно,
а по быстродействию перехожу на тему:

> Замена Chart - графика для слабых компьютеров?


Всем большое спасибо!!!


Rouse_   (2014-06-16 18:16:00) [2]


> Подпрограмму попробую заменить на предложенное:
> function MakeWord(A, B: Byte): Word; inline;
> begin
> Result := A or B shl 8;
> end;

Вопервых, зачем ты полез в ассемблер?
Тут явно не та точка оптимизации, к которой ты стремишься.
А предложенный DVM выше вариант делается гораздо проще:

function MakeWord(A, B: Byte): Word;
asm
 mov ah, dl
end;


Германн уже выше отписал - просадка явно не на количествах итераций, а на работе с файловым ресурсом.


sniknik   (2014-06-16 17:57:00) [3]

> и вывод на экран
еще одно "узкое место" для скорости, по сравнению с вычислениями на пару тройку порядков так.


Inovet   (2014-06-16 17:53:00) [4]

> [10] Inovet ©   (16.06.14 17:52)
> 2^10

и потом 2^20


Inovet   (2014-06-16 17:52:00) [5]

> [9] Who_are_you? ©   (16.06.14 17:27)
> Подпрограмму попробую заменить на предложенное:

Ты попробуй заменить чтение 5 каналов по 2 байта на чтение, например, 5 каналов по 2^10 байта.


Who_are_you?   (2014-06-16 17:27:00) [6]

Спасибо всем за ответы.
Я проконтролирую программу, посчитав на что тратится время, для предметного разговора.
DVM ©   (14.06.14 00:29) [6]

> Через Word читать файл не могу, т.к. значения искажаются.

Это порядок байт отличается в файле и на машине. В файле Big Endian а на машине Little Endian. Можно читать и по два байта за раз и менять байты местами.

Интересно как?

Я делаю так:

 Fail_rd     :array[1..10] of byte; //чтение  5каналов по 2байтa
...
    Resul:=ReadFile(hInFile,Fail_rd,(FileParam.N_channels*2),Bytes,nil);
      ACP_Ex :=conv2Byte_Word(Fail_rd[1],  Fail_rd[2]); // два байта в Word
...
       // два байта в Word без преобразований
function TForm1.conv2Byte_Word(Byte_L :byte; Byte_H :byte) :Word;
var
 www    :Word;  //временная переменная

Begin
 asm            // Word  в  два байта
   PUSH  CX
   MOV   CX,0
   MOV   CL,Byte_L
   MOV   CH,Byte_H
   MOV   www,CX
   POP   CX
 end;
 conv2Byte_Word:=www;
END;

далее математ. вычисления и вывод на экран

Подпрограмму попробую заменить на предложенное:
function MakeWord(A, B: Byte): Word; inline;
begin
Result := A or B shl 8;
end;


sniknik   (2014-06-15 00:54:00) [7]

> Через Word читать файл не могу, т.к. значения искажаются.
> Поэтому более 32000раз обращений.
меньше 64кб? за раз в буфер прочитать и обрабатывать в памяти.

> Скорее всего ты теряешь время на не оптимальной работе с файлом.
+1


Германн   (2014-06-14 02:32:00) [8]


> Who_is_you?   (14.06.14 00:18) [5]
>
> Есть файл байтов, который обрабатывается.
> Числа из двух байтов.
> Через Word читать файл не могу, т.к. значения искажаются.
>

Ну тогда не стоит писать на ассемблере, ибо компилятор всё равно справится лучше. Особенно если вспомнить что в System (SysUtils) ещё со времен царя Гороха существуют такие классические типы как WordRec. (Привет Андрей. Моя чёрная книжка была предназначена для иных целей :)
Кроме того меня весьма смущает "огромность" числа 32000. Имхо нужно очень постараться чтобы 32000 преобразований двух байт в слово заняло сколь нибудь заметное время. Скорее всего ты теряешь время на не оптимальной работе с файлом.


DVM   (2014-06-14 00:29:00) [9]


> Через Word читать файл не могу, т.к. значения искажаются.

Это порядок байт отличается в файле и на машине. В файле Big Endian а на машине Little Endian. Можно читать и по два байта за раз и менять байты местами.


Who_is_you?   (2014-06-14 00:18:00) [10]

Есть файл байтов, который обрабатывается.
Числа из двух байтов.
Через Word читать файл не могу, т.к. значения искажаются.
Поэтому более 32000раз обращений.


Inovet   (2014-06-13 20:29:00) [11]

Удалено модератором


Германн   (2014-06-13 19:32:00) [12]

Удалено модератором


DVM   (2014-06-13 18:16:00) [13]

function MakeWord(A, B: Byte): Word; inline;
begin
 Result := A or B shl 8;
end;


Inovet   (2014-06-13 17:44:00) [14]

> [0] Who_are_you? ©   (13.06.14 16:59)
> без преобразований

Если без преобразований, то они и так объеденины. Надо на область памяти, занимаемую этими байтами, соответсвующий тип назначить.


Наверх

Титульная страница Поиск, карта сайта Написать письмо