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

Вниз

asm вставка ByteToBin и BinToByte   Найти похожие ветки 

 
брюква   (2010-06-20 03:14) [0]

у кого есть такие быстрые вставочки для дельфи,

допустим,

dec 56 = bin 111000, но на вывод надо 00111000  
добивать до 8 бит.


 
KilkennyCat ©   (2010-06-20 03:24) [1]

а по умолчанию байт не добивает?


 
Юрий Зотов ©   (2010-06-20 04:03) [2]

Вряд ли это будет намного медленнее, чем на асме:

function ByteToStr(B: byte): string;
begin
 Result := Format("%d%d%d%d%d%d%d%d",
   [B and 128, B and 64, B and 32, B and 16, B and 8, B and 4, B and 2, B and 1])
end;


 
Юрий Зотов ©   (2010-06-20 04:23) [3]

function StrToByte(S: string): byte;
var
 i: integer;
 Ch: char;
begin
 if (S = "") or (Length(S) > 8)
   raise Exception.Create("Invalid length of string");
 Result := 0;
 for i := Length(S) downto 1 do
 begin
   Ch := S[i];
   if Ch = "1" then
     Result := Result or ((Byte(Ch) - Ord("0")) shl (i -1))
   else
     if Ch <> "0" then
       raise Exception.Create(" Invalid character " + Ch)
 end  
end;


 
Германн ©   (2010-06-20 04:35) [4]


> Юрий Зотов ©   (20.06.10 04:03) [2]
>
> Вряд ли это будет намного медленнее, чем на асме:
>

И с чего бы возникнуть сомнениям?


 
Sha ©   (2010-06-20 10:21) [5]

> И с чего бы возникнуть сомнениям?

С того, что на Паскале, что на ассемблере, быстрее таблицы не придумать :)


 
Jeer ©   (2010-06-20 10:31) [6]

Однако даже не развернутый цикл считает быстрее, чем в [2]

[2] - 12..13 килоциклов

любая из нижеприведенных функций 8..9 килоциклов

function ByteToStr_1(b: byte): string;
var i,t: integer;
begin
 SetLength(Result,8);
 t:=1;
 for i:=8 downto 1 do begin
   if boolean((b and t)) then
     Result[i] := "1"
   else
     Result[i] := "0";
   t := t shl 1;
 end;
end;

function ByteToStr_2(b: byte): string;
var i: integer;
begin
 SetLength(Result,8);
 for i:=8 downto 1 do begin
   if boolean(b mod 2) then
     Result[i] := "1"
   else
     Result[i] := "0";
   b := b shr 1;
 end;
end;


 
Jeer ©   (2010-06-20 10:33) [7]

килоциклов == кило-тиков


 
RWolf ©   (2010-06-20 11:45) [8]

> [6]
тысяч циклов?? столько потеряется разве что на доступе в память мимо кэша, но от этого оптимизация процедуры не спасёт.


 
RWolf ©   (2010-06-20 12:12) [9]

а спасёт — отказ от возврата динамической строки:

type
 TBinString=string[8];

function ByteToStr_3(b: byte): TBinString;
var i: integer;
begin
for i:=8 downto 1 do begin
  if boolean(b mod 2) then
    Result[i] := "1"
  else
    Result[i] := "0";
  b := b shr 1;
end;
end;


на моей машине меньше 400 циклов, согласно показаниям RDTSC.

А вообще, бесполезная это затея — зачем оптимизировать код подготовки human-readable результата? всё равно он затем будет выведен куда-то на монитор, в файл и т.п., на чём в итоге потеряется прорва процессорного времени.


 
RWolf ©   (2010-06-20 12:25) [10]

Ну, и ещё вариант, из любви к искусству:
procedure ByteToStr_6(b: Byte; out res: TBinString);
begin
  if b and $80<>0 then Res[1] := "1" else Res[1] := "0";
  if b and $40<>0 then Res[2] := "1" else Res[2] := "0";
  if b and $20<>0 then Res[3] := "1" else Res[3] := "0";
  if b and $10<>0 then Res[4] := "1" else Res[4] := "0";
  if b and $08<>0 then Res[5] := "1" else Res[5] := "0";
  if b and $04<>0 then Res[6] := "1" else Res[6] := "0";
  if b and $02<>0 then Res[7] := "1" else Res[7] := "0";
  if b and $01<>0 then Res[8] := "1" else Res[8] := "0";
end;


300 циклов.


 
брюква   (2010-06-20 14:01) [11]

Нужны вставочки, я склоняюсь к тому, что работать они будут быстрее..
Выводится никуда ничего не будет, будет перевод в string[8] и обработка этой строки, дальше конвертирование обратно.

И для этого мне нужна макимальная скорость конвертинга.


 
брюква   (2010-06-20 14:08) [12]

RWolf, встречный вопрос, как ты измерял свою процедуру при помощи.
function RDTSC: comp;
var TimeStamp: record case byte of
                 1: (Whole: comp);
                 2: (Lo, Hi: cardinal);
               end;
begin
  asm
    db $0F; db $31;
    mov [TimeStamp.Lo], eax
    mov [TimeStamp.Hi], edx
  end;
  Result := TimeStamp.Whole;
end;
научи.


 
RWolf ©   (2010-06-20 14:19) [13]


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

всё проще:
function RDTSC: Int64; assembler;
asm
RDTSC
end;


 
RWolf ©   (2010-06-20 14:20) [14]


> Выводится никуда ничего не будет, будет перевод в string[8]
> и обработка этой строки, дальше конвертирование обратно.
>

Готов поспорить, что для этой обработки конвертация в строку не нужна вовсе.


 
Sha ©   (2010-06-20 14:43) [15]

> брюква   (20.06.10 14:01) [11]
> будет перевод в string[8] и обработка этой строки,
> дальше конвертирование обратно.

Мне тоже интересно, что за обработка такая, для которой нужна конвертация.


 
брюква   (2010-06-20 15:36) [16]

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

На данный момент я так понял перевод RWolf наиболее быстрый. RWolf, а как обратно перевод сделать?


 
брюква   (2010-06-20 15:45) [17]

Основная работа программы будет заключаться в переводе + маленькая модификация. Так что быстрый перевод просто необходим. Перевод будет осуществляться с файлов. Программа считывает кусками в буфер и дальше нужен очень быстры перевод так как файлы могут быть и 1-2 gb.


 
Sha ©   (2010-06-20 16:28) [18]

> брюква   (20.06.10 15:45) [17]
> маленькая модификация

Не хочешь говорить, что за модификация - не надо.
Тебе же хуже.


 
RWolf ©   (2010-06-20 16:35) [19]

[17]
Повторяю, если хочешь скорости — забудь про преобразования в строки и осиль битовые манипуляции. Тогда счёт будет идти не на тысячи циклов, а на десятки, и без всякого асма.


 
брюква   (2010-06-20 19:36) [20]

RWolf, повторяю. не важно в число или в строку, все равно будет отделение из числа разрядов и работа с ними.

вставочек нет?


 
Sha ©   (2010-06-20 19:39) [21]

> брюква   (20.06.10 19:36) [20]
> отделение из числа разрядов и работа с ними

Для этого конвертация туда-сюда не требуется.
Какие вставочки нужны, чтобы это понять?


 
KilkennyCat ©   (2010-06-20 19:41) [22]

в итоге закончится выяснением, что конвертация нужна для корректной работы
for i := 1 to 8 do :)


 
брюква   (2010-06-20 19:51) [23]

Да нет же, мне надо узнать бинарную вариацию. Далее будет отделение поразрядно, заранее отделять нельзя.. нужно узнать бинарный набор.

Все что вы говорите - оффтоп. Процесс продуман, требует лишь замены этой функции, так как она грузит процесс.


 
KilkennyCat ©   (2010-06-20 19:58) [24]

все равно непонятно. добить лишние нули имеет смысл только в визуализации, в противном случае - они уже добиты, аутоматически, так сказать :)


 
Sha ©   (2010-06-20 20:13) [25]

> брюква   (20.06.10 19:51) [23]
> Процесс продуман,

Если продуман, расскажи что делать с данными собираешься между конвертациями туда-сюда.
Развей наши сомнения.

> требует лишь замены этой функции, так как она грузит процесс.

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

> Все что вы говорите - оффтоп

Пока что такое чувство, что оффтоп как раз конвертация.


 
Amoeba_   (2010-06-20 22:33) [26]


> Процесс продуман

http://www.gunsmoker.ru/2008/10/x-y-z.html


 
Юрий Зотов ©   (2010-06-21 00:23) [27]

> брюква  

Двоичные числа 00100100 и 100100 - это одно и то же. Добавление ведущих нулей имет смысл только при преобразовании в строку для показа человеку.

А Вы говорите, что показывать ничего не собираетесь. Поэтому Вас просто не понимают - зачем тогда нужна какая-то там конвертация?


 
Германн ©   (2010-06-21 01:34) [28]


> А Вы говорите, что показывать ничего не собираетесь. Поэтому
> Вас просто не понимают - зачем тогда нужна какая-то там
> конвертация?

См. [26]

Похоже автор придумал для своей "конвертации" алгоритм, который не может обойтись без преобразования байта в строку из восьми символов.
Ему бы в лицей пойти http://www.delphikingdom.com/asp/viewitem.asp?catalogid=838


 
брюква   (2010-06-21 02:21) [29]

Юрий Зотов, вы что мне простые истины говорите... само собой, но надо 8 бит. Работа будет с этими 8ми битами, так что нужны эти самые 2 нулевых разряда какбэ.

Германн, вопрос не на смех, пройди в другую тему. да

--
троллинг не по сабжу, ребят.


 
брюква   (2010-06-21 02:23) [30]

Германн, я тут давно, от тебя ответы такого типа в темах http://www.youtube.com/watch?v=YamUFw-JsEA  случайно не ты ли это. жжош

см.  [29]


 
Германн ©   (2010-06-21 02:40) [31]


> Германн, вопрос не на смех, пройди в другую тему. да
>

Ты по ссылке в [26] прочитал?
Ты по ссылке в [28] прочитал?

То что ты тут давно, ничего не значит.

"вы что мне простые истины говорите... само собой, но надо 8 бит. Работа будет с этими 8ми битами, так что нужны эти самые 2 нулевых разряда "
Вот эти слова означают, что нужно читать учебники. Или идти в лицей, ссылку на который я дал в [28]. Бо в байте памяти не может быть не 8 бит!

LMD!


 
KilkennyCat ©   (2010-06-21 04:04) [32]


> Бо в байте памяти не может быть не 8 бит!

я бы не стал так категорично... Скажем так, в большинстве известных и наиболееупотребительных случаях в байте 8 бит.


 
Alx2 ©   (2010-06-21 08:05) [33]

>брюква

Гонять в строку, а потом из строки - в куче случаев ничем неоправданная расточительность. С битами можно работать без промежуточной конвертации, сразу рассматривая число как массив бит. Здесь уже писали об этом.

Итак, для чего нужна строка? Признавайся! :)


 
Sha ©   (2010-06-21 09:06) [34]

> брюква   (21.06.10 02:21) [29]

Приводи свой код.
Если его там немного, перепишу без конвертации.
Гарантирую увеличение скорости в 5 раз.


 
Jeer ©   (2010-06-21 09:32) [35]


> RWolf ©   (20.06.10 12:12) [9]
>
> а спасёт — отказ от возврата динамической строки:


И не спорю :)

Примеры привел чисто школьные, чтобы автор топика начал думать.
Варит от ЮЗ, конечно красив, но оптимизации уже не подлежит.

А так - все по уму. Действительно отказ от динамической строки почти на порядок выполняется быстрее.


 
картман ©   (2010-06-21 09:49) [36]


> Sha ©   (21.06.10 09:06) [34]
>
> > брюква   (21.06.10 02:21) [29]
>
> Приводи свой код.
> Если его там немного, перепишу без конвертации.
> Гарантирую увеличение скорости в 5 раз.

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


 
[true]TRIx ©   (2010-06-21 14:30) [37]

вопрос всеж один. asm вставка ByteToBin и BinToByte или приведите самый удачный код в плане скорости перевода. Как в Bin так и обратно. Полемика не требуется.


 
Плохиш ©   (2010-06-21 14:39) [38]

[true]TRIx © = брюква?


 
[true]TRIx ©   (2010-06-21 14:45) [39]

Плохиш, действительно, просвети нас своим вариантом по вопросу.


 
Amoeba_   (2010-06-21 14:54) [40]


> [true]TRIx ©   (21.06.10 14:30) [37]
>
> вопрос всеж один. asm вставка ByteToBin и BinToByte или
> приведите самый удачный код в плане скорости перевода. Как
> в Bin так и обратно. Полемика не требуется.

Впрямь "Сага о Х, Y и Z..."
http://www.gunsmoker.ru/2008/10/x-y-z.html


 
Плохиш ©   (2010-06-21 14:59) [41]


> [true]TRIx ©   (21.06.10 14:45) [39]
>
> Плохиш, действительно, просвети нас своим вариантом по вопросу.

Я задачи высосаные из пальца решаю только после бутылки хорошего виски. Так что несите.


 
Sha ©   (2010-06-21 15:00) [42]

> true]TRIx ©   (21.06.10 14:30) [37]

1. если так, то мой вариант перевода в строку приведен в [5]
2. перевод из строки можно сильно ускорить,
если работать не со строками, а с записями,
содержащими оба представления.

Реализовывать придется самостоятельно, предложение [34] больше не действует.


 
Alx2 ©   (2010-06-21 15:03) [43]

Вот так вота... зажмотил задачку, теперь все обиделись.. :)


 
Anatoly Podgoretsky ©   (2010-06-21 15:07) [44]

> Плохиш  (21.06.2010 14:59:41)  [41]

А одной бутылки то хватит?


 
Alien1769 ©   (2010-06-21 15:15) [45]

>брюква

Покажи цикл обработки битов, если не секрет :)

Или ответь: с какого бита он у тебя начинается...


 
Плохиш ©   (2010-06-21 15:22) [46]


> Anatoly Podgoretsky ©   (21.06.10 15:07) [44]
>
> > Плохиш  (21.06.2010 14:59:41)  [41]
>
> А одной бутылки то хватит?

Хорошего хватит :-)


 
Юрий Зотов ©   (2010-06-21 15:50) [47]

Бесполезно, а потому бессмысленно...


 
[true]TRIx ©   (2010-06-21 15:55) [48]

function ByteToBin(Numer: byte): string; assembler;
asm
cld
mov   al,8
les   di,@Result
stosb
mov   cx,8
mov   bl,Numer
@@m1:
mov   al,"0"
shl   bl,1
adc   al,0
stosb
loop  @@m1
end;


а теперь сравнимаем по скорострельности :)


 
Anatoly Podgoretsky ©   (2010-06-21 16:04) [49]

> Плохиш  (21.06.2010 15:22:46)  [46]

А бутылок должен быть байт.


 
Плохиш ©   (2010-06-21 16:12) [50]


> Anatoly Podgoretsky ©   (21.06.10 16:04) [49]

Я добрый, его разорять не буду :-)


 
Anatoly Podgoretsky ©   (2010-06-21 16:22) [51]

> Плохиш  (21.06.2010 16:12:50)  [50]

Еще бы 8 BITылок


 
[true]TRIx ©   (2010-06-21 16:41) [52]

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


 
Игорь Шевченко ©   (2010-06-21 16:52) [53]

[true]TRIx ©   (21.06.10 15:55) [48]


> а теперь сравнимаем по скорострельности :)


Для байта это не скорострельная операция, для байта скорострельная через таблицу


 
[true]TRIx ©   (2010-06-21 16:54) [54]

Игорь Шевченко ооокееей. Реализация твоей скорострельной функции ByteToBin и BinToByte


 
Игорь Шевченко ©   (2010-06-21 16:54) [55]

[true]TRIx ©   (21.06.10 16:54) [54]


> Реализация твоей скорострельной функции ByteToBin и BinToByte


Сумма не озвучена


 
12 ©   (2010-06-21 17:44) [56]


> Реализация твоей скорострельной функции ByteToBin и BinToByte

procedure TForm1.Button1Click(Sender: TObject);
const
 A : array [0..1] of string[8] =
("00000000","00000001");
begin
 ShowMessage(A[1]);
end;


 
[true]TRIx ©   (2010-06-21 18:07) [57]

12, что за люд пошел. лишь бы присунуть что-то.. анархия, полнейшая.


 
KilkennyCat ©   (2010-06-22 00:29) [58]

case byte of
 0 : string := "00000000";
...
 255 : string := "11111111"
else
 string := "офигеть"
end;

всего ровно 260 строчек


 
Германн ©   (2010-06-22 03:07) [59]

Чушь!


 
12 ©   (2010-06-22 08:25) [60]


> [true]TRIx ©   (21.06.10 18:07) [57]
>
> 12, что за люд пошел. лишь бы присунуть что-то.. анархия,
>  полнейшая.
>

а ты бы хотел, чтоб все 256 значений были?
а вот ты их допиши, и посмотри скорострельность


 
Anatoly Podgoretsky ©   (2010-06-22 08:54) [61]

> KilkennyCat  (22.06.2010 00:29:58)  [58]

Переменное время исполнения, коду 255 очень не повезло.


 
KilkennyCat ©   (2010-06-22 10:37) [62]


> Anatoly Podgoretsky ©   (22.06.10 08:54) [61]

кому-то всегда не везет...
надо же, за всю жизнь только щас озадачился: а как case компилируется, как я его напишу, или сортирует по возрастанию?


 
Sha ©   (2010-06-22 10:44) [63]

> KilkennyCat ©   (22.06.10 10:37) [62]

case в дерево проверок компилируется, весьма эффективно.
Но таблица в данном случае лучше.


 
KilkennyCat ©   (2010-06-22 11:59) [64]


> Sha ©   (22.06.10 10:44) [63]

ага, спасибо. разумеется, таблица лучше, предложение с case - шутка :)
Однако, раньше я слышал, что case - неэффективный... что, впрочем, совершенно меня не останавливало его использовать, ибо очень мне нравится в логичности и читабельности.


 
Anatoly Podgoretsky ©   (2010-06-22 12:30) [65]

> KilkennyCat  (22.06.2010 10:37:02)  [62]

САSE особая форма IF и проверяется последовательно как и IF
Никаких сортировок не делается. По поводу оптимизации сказать труднее.
Справку по case сильно сократили в Дельфи.


 
Игорь Шевченко ©   (2010-06-22 14:30) [66]


> САSE особая форма IF и проверяется последовательно как и
> IF


не всегда особая форма IF и не всегда проверяется последовательно, как IF, в зависимости от значений вариантов может быть оптимизирован в таблицу переходов



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

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

Наверх




Память: 0.64 MB
Время: 0.014 c
2-1277283818
12
2010-06-23 13:03
2010.09.19
Научите работать, как работает ShowMessageFmt


11-1216304360
neccasalmor
2008-07-17 18:19
2010.09.19
как в компоненте montcalendar выделить интервал дней?


2-1277317567
lihoy_p5
2010-06-23 22:26
2010.09.19
загрузка следующего изображения


15-1277407702
AKE
2010-06-24 23:28
2010.09.19
Помогите решить, плиз?


2-1277122422
nobody
2010-06-21 16:13
2010.09.19
Выполнение запросов в потоке, с использованием DOA