Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.11.29;
Скачать: CL | DM;

Вниз

Два байта в одно число   Найти похожие ветки 

 
Who_are_you? ©   (2014-06-13 16:59) [0]

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

Я делаю так:
       // два байта в 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раз.


 
Inovet ©   (2014-06-13 17:44) [1]

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

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


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

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


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

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


 
Inovet ©   (2014-06-13 20:29) [4]

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


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

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


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


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

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


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


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

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


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

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

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


 
Who_are_you? ©   (2014-06-16 17:27) [9]

Спасибо всем за ответы.
Я проконтролирую программу, посчитав на что тратится время, для предметного разговора.
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;


 
Inovet ©   (2014-06-16 17:52) [10]

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

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


 
Inovet ©   (2014-06-16 17:53) [11]

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

и потом 2^20


 
sniknik ©   (2014-06-16 17:57) [12]

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


 
Rouse_ ©   (2014-06-16 18:16) [13]


> Подпрограмму попробую заменить на предложенное:
> 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;


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


 
Who_are_you? ©   (2014-06-17 11:46) [14]

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

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


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



Страницы: 1 вся ветка

Текущий архив: 2015.11.29;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.007 c
2-1402320241
Sakipiel
2014-06-09 17:24
2015.11.29
FindComponent неопределен в пакете


3-1305792508
AlexeyMir
2011-05-19 12:08
2015.11.29
Как представить таблицу для редактирования


15-1427905090
Rouse_
2015-04-01 19:18
2015.11.29
Ну что, делимся, как кого развели на 1 апреля


2-1402536512
Sakipiel
2014-06-12 05:28
2015.11.29
программное создание ClientDataSet что еще я упустил?


15-1426787074
Rouse_
2015-03-19 20:44
2015.11.29
Просто опрос, мне для статистики для статьи