LINUX.ORG.RU

Есть идеи как улучшить?

 


1

2

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

можно ли сделать какие нибудь улучшения

Можно использовать libc, правда не в досбоксе, а в нативном линуксе. тык

BceM_IIpuBeT ★★☆☆☆
()
Ответ на: комментарий от BceM_IIpuBeT

В 32-битном режиме.

Ну да. Зато работает на i386 и x86_64.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от ox55ff

Перепиши на x86_64.

А я понел, это был совет как улучшить.

u0atgKIRznY5
() автор топика

Я думаю, можно бы было для данной задачи заюзать какие-нибудь расширения типа MMX, SSE* и подобные.

Bahamut
()
Ответ на: комментарий от Bahamut

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

Кстати, если заглянуть в недра libc, то можно заметить, что там с оптимизацией все отлично. Поэтому писать такое для самообразования - норм, годится, но для боевых задач разумнее использовать оптимизированный и оттестированный код.

Nietzsche
()
Ответ на: комментарий от Bahamut

Совсем нет. Читаю modern x86 assembly language programming, примеры оттуда процентов на 20-30 быстрее чем код gcc7.1 с -O3. А в части примеров когда компилятор не додумывается что можно использовать SIMD, то разница десятикратная. В части примеров можно переписать C код, чтобы он лучше оптимизировался, но далеко не всегда. Так что это сказки про современные компиляторы. Как минимум нужно знать ассемблер чтобы понимать где можно применять SIMD, тогда можно инспектировать выбранные функции, чтобы посмотреть догадался ли компилятор об этом или нет, и если нет то переписать код/написать эту функцию на ассемблере.

fsb4000 ★★★★★
()
Ответ на: комментарий от Softwayer

Перестать писать бессмысленные комментарии вроде add eax, edx ; прибавить к eax edx

А так нормально то написано? Ничего лишнего? Или можно ещё сократить? Или есть команды, которые лучше подойдут?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от zl0y

Почему не AT&T синтаксис?

Ну я пробывал gas использовать, мне конечно нравиться at&t синтаксис, но intel тоже нравиться. Тем более у at&t большой долг накопился. Intel тоже хороший синтаксис.

Почему не amd64?

Я ещё учусь ассемблеру, и поэтому лучше пока 32 битный выучить. Я писал для x86_64, но особой нужды пока в этом нет.

u0atgKIRznY5
() автор топика

Прежде всего, convert_char отвратительна. Работает только для ASCII, ничего, кроме 0, не проверяется. Используй что-либо другое.

Читай Кнута.

pS
()
Ответ на: комментарий от u0atgKIRznY5
  • есть инфа, что loop на современных процессорах работает заметно медленнее, чем просто dec ecx и jnz cycle.
  • есть movzx, позволяющий не занулять регистр перед заполнением какой-то его части.
  • or al, al ; сравнить

    для этого обычно используют test
  • dec поддерживает работу с памятью, так что не нужно выгружать значение в регистр и потом записывать обратно
  • xor ecx, ecx ; обнулить
    mov ebx, 0 ; код выхода

    Выбрал бы один стиль и придерживался его.

А ещё в 2017 есть yasm, который чуть более фичаст, нежели nasm, и обладает нормальной поддержкой x86_64.

Softwayer ★★
()
Ответ на: комментарий от Softwayer

xor ecx, ecx ; обнулить mov ebx, 0 ; код выхода

Выбрал бы один стиль и придерживался его.

А ну да забыл. Тем более xor ecx, ecx быстрее этого варианта mov ebx, 0, потому как во второй варианте нужно работать с памятью, а это много времени занимает.

есть инфа, что loop на современных процессорах работает заметно медленнее, чем просто dec ecx и jnz cycle.

Откуда такая информация?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от RazrFalcon

Нет описания зачем это нужно.

Нет описания чего?

u0atgKIRznY5
() автор топика

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

qbe
()
Ответ на: комментарий от qbe

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

Функция перевода из строки в число я взял из книги, там есть перевод и шестнадцатеричного числа и отрицательного числа.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от Softwayer

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

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

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

Softwayer ★★
()
Ответ на: комментарий от Softwayer

Вот обсуждение этого явления и его причин, первоисточником же является, видимо, один из optimization guide-ов

Интересно да, что такая тема заводилась?

u0atgKIRznY5
() автор топика

После call convert_char для sub al,'0' упал и умер. Выше абсолютно правильно посоветовали - посмотреть, как это сделает gcc.

AlexAT
()
Ответ на: комментарий от SZT

Код топикстартера неэффективен, комментировать даже лень

Плохо что код на вас так повлиял, и как это код так смог лень на вас наложить?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Плохо то, что ты занимаешься засиранием лора своими глупыми вопросами, facepalm.jpg

Между прочим, вот те ссылки на gcc bugzilla, это все мои багрепорты

SZT ★★★★★
()
Ответ на: комментарий от SZT

Плохо то, что ты занимаешься засиранием лора своими глупыми вопросами, facepalm.jpg

Плохо что умные люди не могут помочь, наверное воспитание такое.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

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

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)
Ответ на: комментарий от SZT

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

А зачем тогда вам на форуме бывать? Чтобы самому вопросы задавать? Тоесть, когда вам что-то нужно так это должны предоставить ответ? А когда сами, так не задавай вопросов глупых. Или вы только сами себя хвалите что умнее, и чтобы умнее вас никто не стал, вы не помогаете. Давай никто не будет отвечать на тупые вопросы, ну ты этого тоже когда то незнал.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

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

call для однострочника. Две стэковых операции на один примитивный sub. Это вообще ни в какие ворота.

AlexAT
()
Ответ на: комментарий от u0atgKIRznY5

Так мои вопросы почему-то намного умнее твоих оказываются.

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

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

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

http://l.wzm.me/_nezumi/optimize.htm читай тут

Семь китов оптимизации или Жизненный цикл оптимизации

SZT ★★★★★
()
Ответ на: комментарий от AlexAT

Две стэковых операции на один примитивный sub.

А да, работа со стеком медленнее чем работа с глобальными переменными. Тогда можно без convert_char.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Ты эту информацию отлично смог бы сам нагулить, а не создавать бессмысленные треды на ЛОРе

SZT ★★★★★
()
Ответ на: комментарий от SZT

Ты эту информацию отлично смог бы сам нагулить, а не создавать бессмысленные треды на ЛОРе

Спасибо за принятие участие в моей сингулярности.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Што?

Не в этом суть: на одну быструю команду ты имеешь аж два обращения к стэку - на call и ret. И это только начало.

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

AlexAT
()
Ответ на: комментарий от AlexAT

Например даже вот mov eax, 4 пример. Можно сделать быстрее, тоже самое, только быстрее, потому что не обращается к памяти.

xor eax, eax
times 4 inc al

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

С чего ты взял, что mov константы в регистр обращается к памяти? Константа просто кодируется в опкоде и поэтому его размер может получиться больше, чем какой-нибудь xor, однако это может в ряде случаев даже оказаться полезным (выравнивание инструкций, например).

Softwayer ★★
()
Ответ на: комментарий от Softwayer

С чего ты взял, что mov константы в регистр обращается к памяти?

Я в книжке прочитал. Там написан вариант с xor и inc, который в ряде случаешь будет быстрее ( смотря сколько inc ). Ты можешь у кого нибудь узнать, кто в этом разбирается, интересно было бы послушать. Но в книге же на станут врать.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Станут. Точнее, книга может попросту устареть и/или автор может ошибаться

http://www.intel.com/content/dam/doc/manual/64-ia-32-architectures-optimizati...

Страница 160 в pdf файле:

GENERAL OPTIMIZATION GUIDELINES
3.5.1.1 Use of the INC and DEC Instructions
The INC and DEC instructions modify only a subset of the bits in the flag register. This creates a dependence on all previous writes of the flag register. This is especially problematic when these instructions are on the critical path because they are used to change an address for a load on which many other instructions depend.

Assembly/Compiler Coding Rule 33. (M impact, H generality)
INC and DEC instructions should be replaced with ADD or SUB instructions, because ADD and SUB overwrite all flags, whereas INC and DEC do not, therefore creating false dependencies on earlier instructions that set the flags.

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 3)
Ответ на: комментарий от Softwayer

С чего ты взял, что mov константы в регистр обращается к памяти?

Но ты же не можешь скопировать число в переменную. mov [str], 0. Потому что из памяти в память нельзя, копировать из памяти можно только с помощью регистров. А если это так, то ноль в этом случае трактуется как копирование из памяти. mov eax, 0.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от SZT

Я вот думал как заменить команду умножения, и вот, можешь сказать, это лучше этого imul ebx, ecx умножения?

  xor edx, edx
  mov edx, ebx
  shl ebx, 3
  shl edx, 1
  add ebx, edx
Это тоже работает как нужно, оно быстрее умножения? И можно ли другой командой заменить последнюю инструкцию ( add ebx, edx )? Типа or ebx, edx, но только с присваиванием к ebx.

u0atgKIRznY5
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.