Главная страница
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



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

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

Наверх




Память: 0.57 MB
Время: 0.008 c
2-1277152731
Askalot
2010-06-22 00:38
2010.09.19
Тормоза


2-1277194041
ixen
2010-06-22 12:07
2010.09.19
Фильтрация с задержкой


15-1277470736
12
2010-06-25 16:58
2010.09.19
Киньтесь ссылкой на архив иконок


15-1276851347
Kerk
2010-06-18 12:55
2010.09.19
Кто-нибудь сталкивался с nosql-базами?


15-1277321953
Petr V. Abramov
2010-06-23 23:39
2010.09.19
Как правильно пожарить свиную шейку?