Форум: "Начинающим";
Текущий архив: 2015.11.29;
Скачать: [xml.tar.bz2];
ВнизДва байта в одно число Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c