LINUX.ORG.RU

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

 


1

2

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

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

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

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

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
() автор топика
Ответ на: комментарий от AlexAT

Ох бред. Есть movs[b/w/d/q].

Причём тут вообще эта инструкция? Если ты о «из памяти в память», то это не то, потому что здесь работа с регистрами выполняется, а без регистров из памяти в память нельзя.

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

У процессора же нет двух каналов с памятью, а только один канал. Как он может за команду получить сигнал и отправить его? Никак. Поэтому, проц сначала получить из памяти значение, изменит его, а потом отправит по этому же каналу.

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

xor edx, edx
mov edx, ebx
shl ebx, 3
shl edx, 1
add ebx, edx

Зачем здесь xor - вообще мало понятно. Далее - зависимая цепочка: mov edx, ebx и shl ebx уже на части процов не распараллелятся, а далее ещё shl edx и зависимая от всего этого счастья add ebx,edx, которые вообще поставят очередь исполнения раком...

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

xor -это так во всех учебника, (первые две строчки), описано как регистры обнулять -вроде как по быстрому.

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

Так точно :) Увы, только на самых современных, на том же Nehalem (все ксеоны до сих пор ходовых E/X серий) всё плохо.

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

Зачем обнулять регистр, если далее его перезагружаем полностью? Флаги в данном случае тоже трогать излишне.

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

я с ассемблером уже как два года необщаюсь никак, а он быстро забывается, почти мгновенно - только помню что так положенно делать - во всех учебниках что я видел всегда так делали. Возможно потому что последующая операция очень часто может быть add а не mov

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

имею от советских учебник очень положительные воспоминания, сейчас пишут хуже

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

... я даже не знаю снова, что на это сказать

Эту тоже придётся потом читать.

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

С mov reg,0 / xor reg,reg тоже всё не совсем просто... Есть даже посвящённый этому пункт в интеловском гайде, 3.5.1.8.

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

Это как? У процессора вообще нет никаких переменных

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

А если это так, то ноль в этом случае трактуется как копирование из памяти. mov eax, 0.

Ответили ещё или нет, но 0 это immediate

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

Какая бурная фантазия. Хотел скинуть интересную инфу, но вижу, что ещё рано, с такими-то познаниями

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

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

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

чтобы так не позориться.

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

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

быстрее, потому что не обращается к памяти.

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

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

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

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

Но, насколько мне известно, в современных процессорах используется кэш 1-ого уровня, который ничем не отличается от регистров по скорости

Ну вообще-то обращения к нему отличаются по скорости, если ты об этом

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

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

Ну вообще-то обращения к нему отличаются по скорости, если ты об этом

А ссылку на пруф можно? Это не подковырка, а действительно интересно об этом почитать, если оно так. 5-минутный гуглопоиск ничего не дал.

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

https://stackoverflow.com/questions/10274355/cycles-cost-for-l1-cache-hit-vs-...
Второй ответ говорит, что разница есть, а первый — что её нет

Спасибо за ссылку. Похоже, что небольшая разница между кэшем L1 и регистрами в пользу последних всё-таки существует, хотя некоторые тесты и говорят об обратном. Впрочем, чтобы доверять тесту, надо знать, как он проводился, ведь от этого очень многое зависит. У меня большее доверие вызывают ссылки на таблицы из документов, чем ссылка на какой-то тест, проведённый неизвестно кем неизвестно в каких условиях.

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