Форум: "Прочее";
Текущий архив: 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