Сейчас на форуме: jinoweb (+6 невидимых)

 eXeL@B —› Программирование —› ByteToHex
<< . 1 . 2 . 3 . 4 . 5 . >>
Посл.ответ Сообщение


Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 07 июля 2018 22:06 · Поправил: Isaev
· Личное сообщение · #1

Не подскажите максимально быстрый способ перевода? Помню во времена доса на асме буквально из десятка байт был финт для этого дела, может помнит кто?
А то дельфовый IntToHex(n, 2) сожрал всю скорость, посмотрев сырки стало сразу понятно куда)

А вообще нужно из md5 массива байт строку собрать
если делать влоб
Code:
  1. s:='';
  2. for i:=0 to 15 do
  3.   s:=s+IntToHex(Digest[i], 2);

то 10млн раз выполняются около 6 сек, хотелось бы поделить это время на 2 или 3... к слову, если вместо IntToHex просто добавлять '00', то будет 2 сек. Пробовал вместо простой конкатенации заюзать TStringBuilder, но нынче, похоже менеджер памяти уже сам вполне справляется с этим хламом и с ним только на 1 сек дольше получается. Так же пробовал выделить память сразу под всю строку и мувами загонять на места, но получается тоже дольше... в общем проблема только в переводе в hex, остальное, похоже достаточно оптимально работает

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 08 июля 2018 16:34 · Поправил: dosprog
· Личное сообщение · #2

Вот пример программки на Си:

Code:
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <windows.h>
  4. void
  5. byte2hex(char* pbyte, char* pout)
  6. {
  7. unsigned char bytevar = *pbyte
  8.   ,outchar;
  9.  outchar=(bytevar & 0xF) + 0x30;
  10.  if( outchar > 0x39) outchar=outchar+7;
  11.  *(pout+1)=outchar;
  12.  outchar=((bytevar>>4) & 0xF) + 0x30;
  13.  if( outchar > 0x39) outchar=outchar+7;
  14.  *(pout)=outchar;
  15. }
  16. void
  17. main(void)
  18. {
  19. unsigned char c=0x8E;
  20. unsigned char *pc="\0\0\0";
  21. byte2hex( &c, pc);
  22. printf("%s",pc);
  23. }


Процедура byte2hex() транслируется в такой код:
Code:
  1. 00401000  /$ 8B4424 04      MOV EAX,DWORD PTR SS:[ESP+4]
  2. 00401004  |. 8A10           MOV DL,BYTE PTR DS:[EAX]
  3. 00401006  |. 8ACA           MOV CL,DL
  4. 00401008  |. 80E1 0F        AND CL,0F
  5. 0040100B  |. 80C1 30        ADD CL,30
  6. 0040100E  |. 80F9 39        CMP CL,39
  7. 00401011  |. 76 03          JBE SHORT 00401016
  8. 00401013  |. 80C1 07        ADD CL,7
  9. 00401016  |> C0EA 04        SHR DL,4
  10. 00401019  |. 8B4424 08      MOV EAX,DWORD PTR SS:[ESP+8]
  11. 0040101D  |. 80C2 30        ADD DL,30
  12. 00401020  |. 8848 01        MOV BYTE PTR DS:[EAX+1],CL
  13. 00401023  |. 80FA 39        CMP DL,39
  14. 00401026  |. 76 03          JBE SHORT 0040102B
  15. 00401028  |. 80C2 07        ADD DL,7
  16. 0040102B  |> 8810           MOV BYTE PTR DS:[EAX],DL
  17. 0040102D  \. C3             RETN


Тут и оптимизаций никаких не требуется, всё и так нормально.



| Сообщение посчитали полезным: Crawler, Isaev


Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 08 июля 2018 16:49
· Личное сообщение · #3

dosprog, круто. Работает в среднем в 2-3 раза быстрее, чем itoa() на рандомных наборах данных)

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.





Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 08 июля 2018 20:36 · Поправил: f13nd
· Личное сообщение · #4

dosprog пишет:
Тут и оптимизаций никаких не требуется, всё и так нормально.

Все сишники так говорят, а потом в mr. exodia's debugger'е контекстные меню с лагом отрисовываются

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

-----
2 оттенка серого





Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 08 июля 2018 21:51
· Личное сообщение · #5

f13nd пишет:
поставить себя в рамки текстовой формы вывода данных

Вообще не понял, о чем речь, если честно - какой вывод, какие рамки? О__о Текстовая форма? О___о чего... может, я тупой, поясните, что ли.

По поводу оптимизаций - тоже не понял. А что там оптимизировать? Если у человека руки не из жопы, то компилятор реально компилирует сишный код так, что на Ассемблере самостоятельно лучше не напишешь в 99% случаев. Это вроде как общеизвестный факт.

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.





Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 08 июля 2018 22:14
· Личное сообщение · #6

dosprog

Статистика(i5) по вашей функи и _itoa, ваша быстрее в 3.5 раз. Если взять так:

Code:
  1. Table    DB "0123456789ABCDEF"
  2.  
  3. b2hex proc Value:DWORD, Result:PSTR
  4.          mov eax,Value
  5.          mov ecx,eax
  6.          shr eax,4
  7.          and ecx,15
  8.          mov al,[Table][eax]
  9.          mov ah,[Table][ecx]
  10.          mov edx,Result
  11.          mov W[edx],ax
  12.          ret
  13. b2hex endp


То получается всего лишь в 1.4 раза быстрее, чем у вас, те разница мала. Нужно выполнять как можно меньше обращений в память и убрать конвенцию, те вставить процедуру как макро.

-----
vx


| Сообщение посчитали полезным: Crawler


Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 08 июля 2018 22:22 · Поправил: f13nd
· Личное сообщение · #7

Crawler пишет:
Вообще не понял, о чем речь, если честно - какой вывод, какие рамки?

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

Ну а про руки и жопы, я больше склонен в тупняках ПО считать виновным злоупотребление чужими библиотеками и использование их не по назначению.

ЗЫ: на правах хохмы --> Link <-- В далеком 2009 сделал этот скриншот, иногда на него посматриваю и до сих пор не понял что за треш тут происходит и чьих это рук дело: разработчика или компилятора. А может трюк для системы предсказания ветвлений интела, что это вообще.

-----
2 оттенка серого




Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 08 июля 2018 22:31
· Личное сообщение · #8

f13nd, очень любопытный скрин




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 08 июля 2018 22:45
· Личное сообщение · #9

f13nd

По скрину получается что имеется цикл сразу за апи, которая отладочная(генерация ошибки) и не возвращает просто так управление. Значит что цикл это место останова или какой то маркер для обработчика ошибки, к примеру он может поменять условие и приложение будет висеть, до аттача отладчика. Зачем иначе это сделано хз.

-----
vx





Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 08 июля 2018 22:47 · Поправил: f13nd
· Личное сообщение · #10

difexacaw пишет:
приложение будет висеть, до аттача отладчика
Всегда казалось, что xor ecx,ecx дает zf=0. А точно, одной загадкой меньше.

-----
2 оттенка серого





Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 08 июля 2018 22:50 · Поправил: difexacaw
· Личное сообщение · #11

f13nd

Один бит поксорить нужно в ветвлении что бы сменить условие на обратное. А может автор туда хотел int3 вписать, больше ничего предположить нельзя. Однозначно можно сказать что это отладочная фича.

-----
vx





Ранг: 104.9 (ветеран), 47thx
Активность: 0.040.02
Статус: Участник

Создано: 08 июля 2018 22:53 · Поправил: ManHunter
· Личное сообщение · #12

Зубков же
Code:
  1. ; al - hex-цифра
  2. cmp      al,10
  3. sbb      al,69h
  4. das
  5. ; al = символ 0..F




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 08 июля 2018 23:02
· Личное сообщение · #13

за такие оптимизации руки нужно рубить. добавили асм вставку с мыслями гыгылол тупой конпилятор и тем самым на@бнули оптимизатор, выиграли в одном месте секунду, а в других потеряли десятки. если делайте вставки заворачивайте их в функцию и собирайте в obj. тс какой-то наркоман, я конечно понимаю что в делфи строки удобные, только зачем с ними работать и тем более зачем хранить строки когда можно хранить индексы, против делфи как языка ничего не имею, но вот пишущие на нем зачастую калеки.




Ранг: 338.5 (мудрец), 349thx
Активность: 2.112.42
Статус: Участник

Создано: 08 июля 2018 23:10
· Личное сообщение · #14

ManHunter

Code:
  1. z2h proc Value:DWORD, Result:PSTR
  2.          mov eax,Value
  3.          mov ah,al
  4.          and al,15
  5.          shr ah,4
  6.          cmp al,10
  7.          sbb al,69h
  8.          das
  9.          xchg al,ah
  10.          cmp al,10
  11.          sbb al,69h
  12.          das
  13.          mov edx,Result
  14.          mov W[edx],ax
  15.          ret
  16. z2h endp


1.3 раза просадка от byte2hex().

-----
vx





Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 08 июля 2018 23:21 · Поправил: f13nd
· Личное сообщение · #15

shellstorm пишет:
добавили асм вставку с мыслями гыгылол тупой конпилятор и тем самым на@бнули оптимизатор

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

-----
2 оттенка серого




Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 09 июля 2018 00:07
· Личное сообщение · #16

f13nd пишет: Все сишники так говорят, а потом в mr. exodia's debugger'е контекстные меню с лагом отрисовываются


У него по большей части архитектурные проблемы, там UI как спрут, опутал практически все компоненты отладчика, а Qt не претендует на рекордный отклик, толстый рантайм с медленным рендером.
Проблема в целом похожа на проблему ТС, только у одного помешательство на UI, у другого на строках.

| Сообщение посчитали полезным: Bronco

Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 09 июля 2018 01:49 · Поправил: dosprog
· Личное сообщение · #17

f13nd пишет:

dosprog пишет:
Тут и оптимизаций никаких не требуется, всё и так нормально.

Все сишники так говорят, а потом в mr. exodia's debugger'е контекстные меню с лагом отрисовываются


Таки требуется?
Ну, сделай, - интересно, как оно будет выглядеть.


f13nd пишет:
ЗЫ: на правах хохмы --> Link <-- В далеком 2009 сделал этот скриншот, иногда на него посматриваю и до сих пор не понял что за треш тут происходит и чьих это рук дело: разработчика или компилятора. А может трюк для системы предсказания ветвлений интела, что это вообще.

Такого добра полно обычно, это нормально.
Это код из библиотеки, которая транслировалась с дефайнами.
Причём слелано было так, чтобы размер кода в обоих случаях (0/1) был одинаков.

Примерно так:

Code:
  1. DEBUG equ 1
  2. .....
  3. ....
  4. mov ecx, DEBUG
  5. test ecx,ecx
  6. jz @@skip
  7. ....
  8. ...
  9. @@skip:







Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 09 июля 2018 02:52 · Поправил: f13nd
· Личное сообщение · #18

dosprog пишет:
Ну, сделай, - интересно, как оно будет выглядеть.

Кто будет выглядеть? Еще один клон ольги? Хороший понт конечно дороже денег, но меня это к сожалению на подвиг не вдохновляет Можно просто на слово поверить, что мои менюшки, сделанные на апи, не тормозят. Если речь идет о приведенной функции, то я в том же посте обозначил, что если мы выжимаем максимум, ее вообще быть не должно там.

dosprog пишет:
Такого добра полно обычно, это нормально.
Это код из библиотеки, которая транслировалась с дефайнами.

Ну может быть потерялось там что-то из-за отключенного дефайна, тоже правдоподобная версия.

-----
2 оттенка серого




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 09 июля 2018 03:18 · Поправил: dosprog
· Личное сообщение · #19

Ничего там не потерялось, всё на месте.


f13nd пишет:
Кто будет выглядеть? Еще один клон ольги? Хороший понт конечно дороже денег, но меня это к сожалению на подвиг не вдохновляет

Какие клоны? Какие понты?
Выглядеть будет не кто, а что - оптимизированная тобой функция byte2hex(), которая первоначально оттранслирована MSVC и её дизасм-листинг из отладчика был выложен тут в --> предыдущем посте <--.

Там ты хоть вывернись, а сколько-нибудь существенной оптимизации не добьёшься.
Ну, убрать пару обращений к памяти - так это пыль.






Ранг: 271.4 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 09 июля 2018 03:27 · Поправил: f13nd
· Личное сообщение · #20

dosprog пишет:
Там ты хоть вывернись, а сколько-нибудь существенной оптимизации не добьёшься.

В третий раз говорю: объявлю буфер размером *ста мегабайт, кратным полю хеш-суммы и по мере заполнения буду выбрасывать на диск, итого 0 тактов процессора на преобразование в текст. Неплохо оптимизировано?

ЗЫ: ну и если уж на то пошло, вижу 2 выборки указателя из памяти в этом листинге. Знаю, что кэш-память и всё такое, и скорей всего реального обращения к ОЗУ там каждый раз не будет, но сама инструкция выборки это тоже процессорное время. Да к тому же это еще и функция, то есть адрес возврата+аргументы туда-сюда по стеку гоняются, та же история. Так что вывернуться ещё как можно, был бы резон это делать.

-----
2 оттенка серого





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 09 июля 2018 05:12 · Поправил: Bronco
· Личное сообщение · #21

f13nd пишет:
а потом в mr. exodia's debugger'е контекстные меню с лагом отрисовываются

+1
если в цикле больше 5-10к чего угодно, адские потери по времени, пока гуй синхронизируется. приходиться гальмовать доуевентами и принтами в статус бар, чтоб не так скучно было.
с shellstorm, согласен полностью, это не сишный код, это гуй кьюта задумчивый. вот она теневуха крос платформы.

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 09 июля 2018 10:03 · Поправил: dosprog
· Личное сообщение · #22

f13nd пишет:
был бы резон это делать.

Нету резона. Всё и так нормально.





Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 09 июля 2018 13:01 · Поправил: user99
· Личное сообщение · #23

Isaev, если еще есть вопрос по конвертации, то достаточно быстрый способ такой:
Code:
  1. function _8BitToHex(value: Byte): AnsiChar; inline;
  2. begin
  3.   if (value < 10) then
  4.     Result := AnsiChar(value + 48)
  5.   else
  6.     Result := AnsiChar(value + 65 - 10);
  7. end;
  8.  
  9. procedure YourProc();
  10. begin
  11.   SetLength(s, 16 * 2);
  12.   for i := 0 to 15 do
  13.   begin
  14.     s[* 2 + 1] := _8BitToHex(Digest[i] div 16);
  15.     s[* 2 + 2] := _8BitToHex(Digest[i] mod 16);
  16.   end;
  17. end;

Я эту функцию тестил на каком-то допотопном компе, получалось 70к байт конвертировались в HEX-строку не более 5мс.



Ранг: 15.8 (новичок), 3thx
Активность: 0.030.01
Статус: Участник

Создано: 09 июля 2018 17:01
· Личное сообщение · #24

16 байт и если out буффер предопределен. Ну, то есть сами под себя смотрите. Прок изначально написана под 8 байт пришлось добавить луп, тут надо бы AnsiChar, чтоб сразу вот 16 махом, но сначала войти в курс что такое psllw xmm0, 12 И вообще эту развертку реверсить.
Code:
  1. procedure ByteToHexW(const Source:PByte;const Buffer:PWideChar);
  2. asm
  3.   mov       eax,-1
  4.   lea       rdx,[Buffer]
  5.  
  6. @@loop:
  7.   pmovzxbw  xmm0,[rcx]
  8.   movdqa    xmm1,xmm0
  9.   psllw     xmm0,12
  10.   psrlw     xmm0,4
  11.   psrlw     xmm1,4
  12.   por       xmm1,xmm0
  13.   pshuflw   xmm1,xmm1,$1B
  14.   pshufhw   xmm1,xmm1,$1B
  15.   movdqa    xmm0,xmm1
  16.   pcmpgtb   xmm0,dqword ptr [@@09]
  17.   pblendvb  xmm2,xmm1,xmm0
  18.   paddb     xmm2,dqword ptr [@@07]
  19.   pblendvb  xmm1,xmm2,xmm0
  20.   paddb     xmm1,dqword ptr [@@30]
  21.   pxor      xmm2,xmm2
  22.   pmovzxbw  xmm0,xmm1
  23.   punpckhbw xmm1,xmm2
  24.   inc       eax
  25.   shl       eax,5
  26.   lea       rcx,[rcx+$08]
  27.   lea       rdx,[rdx+rax]
  28.   movdqu    [rdx+00],xmm1
  29.   movdqu    [rdx+16],xmm0
  30.   jz        @@loop
  31.   ret
  32.  
  33.   .ALIGN 16
  34. @@09: dq $0909090909090909, $0909090909090909
  35. @@07: dq $0707070707070707, $0707070707070707
  36. @@30: dq $3030303030303030, $3030303030303030
  37. end;
  38.  
  39. procedure Test;
  40. var
  41. : array [0..1] of UInt64;
  42. : string;
  43. begin
  44. V[0] := $0001020304050607;
  45. V[1] := $0809AABBCCF49CEE;
  46. SetLength(S,32);
  47. ByteToHexW(@V,@S[1]);
  48. end;




Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 09 июля 2018 18:06
· Личное сообщение · #25

какой-то херней маетесь.
юзать сомнительные асм вставки с хмм регистрами и тут же похерив всю "оптимизацию"(?), дёрнув SetLength

shellstorm пишет:
но вот пишущие на нем зачастую калеки.

юзаю дельфи лет 10-15, глаза/конечности на месте, ливер в порядке.
спускать постоянно в трубу месяцы на разработку уи на апи(+ желательно чтоб оно работало), это не по мне, так и за всю жизнь можно ничего не написать, но вообще дураков работа любит



Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 09 июля 2018 18:21 · Поправил: shellstorm
· Личное сообщение · #26

SReg пишет: спускать постоянно в трубу месяцы на разработку уи на апи(+ желательно чтоб оно работало), это не по мне, так и за всю жизнь можно ничего не написать, но вообще дураков работа любит

с каких пор в билдере UI стало сложнее делать? калеки в том смысле, что подавляющие большинство не могут реализовать самые банальные алгоритмы, не утверждаю, что все, но большинство, нет компонента, все, конец света. сам язык лучше многих и даже из прода, мне не нравится аудитория этого языка.

Crawler

все же равнозначного дизайнера нет ни у кого, даже у Qt уступает по скорости сделать хоть какой нибудь UI.
у nana его вообще нет, у wxwidget привет из нулевых, gtk такая же история, сделать быстро и красиво, пожалуй только Qt с билдером.
есть еще варианты с js декларативом, на этих фреймворках написаны почти все морды основных ав вендоров, но скорость работы оставляет желать лучшего, не electron но скоростями не удивляет.




Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 09 июля 2018 18:24
· Личное сообщение · #27

SReg, на С++ написаны сотни библиотек для создания UI десятью строчками (чем плох тот же QT, Nana, например, из старых есть FLTK, и так далее).

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.




Ранг: 315.1 (мудрец), 631thx
Активность: 0.30.33
Статус: Модератор
CrackLab

Создано: 09 июля 2018 18:35
· Личное сообщение · #28

Crawler пишет:
на С++ написаны сотни библиотек для создания UI десятью строчками (чем плох тот же QT

да ничем не плох, не я утверждал обратное, и не я говорил про калек



Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 09 июля 2018 18:43
· Личное сообщение · #29

SReg пишет: да ничем не плох, не я утверждал обратное, и не я говорил про калек

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




Ранг: 216.9 (наставник), 85thx
Активность: 0.310.15
Статус: Участник
X-Literator

Создано: 09 июля 2018 18:59
· Личное сообщение · #30

shellstorm
Начнём с того, что C/C++ созданы не для того, чтобы рисовать интерфейсы. Написал ядро, которое быстро работает, а обвесить его можно уже чем угодно, ИМХО.

-----
Харе курить веники и нюхать клей, к вам едет из Америки бог Шива, и он еврей.


| Сообщение посчитали полезным: SReg

Ранг: -0.7 (гость), 170thx
Активность: 0.540
Статус: Участник

Создано: 09 июля 2018 19:30
· Личное сообщение · #31

Crawler пишет: Начнём с того, что C/C++ созданы не для того, чтобы рисовать интерфейсы.

кто сказал тебе такую глупость? ознакомься с историей языка, на момент его создания его хейтили за прожорливость и неповоротливость готового софта, современные хипстерские языки повторяют историю. ничего, что подавляющие большинство осевых морд написаны на сишке, как и игровых движков.
с++ вообще решает архитектурные проблемы с. можно, но кто будет обвешивать гипотетически можно и уехм гвоздь забить.


<< . 1 . 2 . 3 . 4 . 5 . >>
 eXeL@B —› Программирование —› ByteToHex
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати