![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Два байта в одно число [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)
> без преобразований
Если без преобразований, то они и так объеденины. Надо на область памяти, занимаемую этими байтами, соответсвующий тип назначить.