Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.007 c
2-1275926246
TStas
2010-06-07 19:57
2010.09.19
Локальные константы подпрограмм


15-1277651139
AKE
2010-06-27 19:05
2010.09.19
Стоит ли студенту изучать что-то дополнительно...


15-1277551866
Илья_
2010-06-26 15:31
2010.09.19
Компонент для работы с локальной сетью


2-1277491678
New555
2010-06-25 22:47
2010.09.19
if Key = VK_F1 then


2-1276167910
dimds
2010-06-10 15:05
2010.09.19
Подключение к серверу из среды Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский