Оптимизация

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Оптимизация

Сообщение qwertylol » 09 янв 2008, 03:18

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

Код: Выбрать все

if(!(A<=0) && !(B>=0))
 n=A-((A>>6)<<6);
else if(!A && B!=0)
 n=(5*A*B)%4;
else
 n=A&0x3f;

Эта задачка из одной не очень известной книги. Сам я этот примерчик решить не смог и даже после того, как посмотрел правильный ответ, несколько минут сидел c листком и ручкой не веря в то, что так очевидно :yes: .
Последний раз редактировалось qwertylol 30 ноя 2019, 13:40, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 09 янв 2008, 05:47

qwertylol писал(а):Source of the post

Код: Выбрать все

 n=A&0x3f;


Один вопрос, a какая подразумевается разрядность ячеек A,B,n?
A то это может показться существенным. Ибо A&0x3f можно интерпритировать как сброс 6 млачших бит (как и A>>6):)
Последний раз редактировалось master 30 ноя 2019, 13:40, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Оптимизация

Сообщение qwertylol » 09 янв 2008, 13:18

A&0x3f можно интерпритировать как сброс 6 млачших бит (как и A>>6)<<6), если A 16 разрядов

(A>>6)<<6 сбрасывает младшие 6 бит, a вот A&63 нет. Это наоборот сброс всех бит в переменной, кроме 6-ти младших($$63_{10}=111111_{2}$$). По поему тут разрядность неважна(3f в любом случае будет приведён к типу переменной A, дописыванием старших нулей), если я не прав, то привидите пример, когда A-((A>>6)<<6) и A&63, это не одно и тоже.З.Ы. A верный ответ вы уже знали, или сами к нему пришли?
Последний раз редактировалось qwertylol 30 ноя 2019, 13:40, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Soul
Сообщений: 2475
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение Soul » 09 янв 2008, 14:10

"else if(!a && B!=0)"
Язык регистрозависимый или нет? Я так понимаю здеь A тоже, что и в других выражениях?
Последний раз редактировалось Soul 30 ноя 2019, 13:40, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Оптимизация

Сообщение qwertylol » 09 янв 2008, 14:16

Да, C- это регистрозависимый язык. Набивал всё руками, отсюда и опечатка. Уже подправил.
Последний раз редактировалось qwertylol 30 ноя 2019, 13:40, всего редактировалось 1 раз.
Причина: test

Draeden
Сообщений: 1613
Зарегистрирован: 24 ноя 2007, 21:00

Оптимизация

Сообщение Draeden » 12 янв 2008, 19:23

хммм... a что делает такой код и как его оптимизировать:

mov eax, 1
mov ebx, 1
mov ecx, 10
do:
lea ebx, [eax + ebx]
xor eax, ebx
xor ebx, eax
xor eax, ebx
dec ecx
jns do
Последний раз редактировалось Draeden 30 ноя 2019, 13:40, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 12 янв 2008, 20:44

Draeden писал(а):Source of the post
хммм... a что делает такой код и как его оптимизировать:

mov eax, 1
mov ebx, 1
mov ecx, 10
do:
lea ebx, [eax + ebx]
xor eax, ebx
xor ebx, eax
xor eax, ebx
dec ecx
jns do

Эх, давно я родимый асм не видел

He знаю. есть ли смысыл под i386 страдать таким способом обмена регистров, не уверен что это будет быстрее чем xchg
Хм.. что же оно делает.. не скажу... смысла глубокого c первого взгляда не уловил
или точнее последовательность in+2=in+1+in, i1=1, i2=1

Можно так к примеру

mov eax, 1
mov ebx, eax
mov ecx, 11
do:
add ebx, eax
xchg eax, ebx;
loopnz do
Последний раз редактировалось master 30 ноя 2019, 13:40, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Оптимизация

Сообщение qwertylol » 12 янв 2008, 22:20

Мдя, к стыду своему я асм пока не осилил, но мне кажется, что в данном случае можно сделать так:

Код: Выбрать все

mov eax, 1
mov ebx, eax
mov ecx, 11
do:
 push eax;
 add eax, ebx;
 pop ebx;
loopnz do

Если не прав, то мастер поправит . Смысла в этом коде нет, на выходе тут будет eax=233, ebx=144, ecx=0(в твоём варианте ecx=-1 и флаг S установлен).
Последний раз редактировалось qwertylol 30 ноя 2019, 13:40, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
master
Сообщений: 2167
Зарегистрирован: 09 апр 2006, 21:00

Оптимизация

Сообщение master » 12 янв 2008, 22:33

Да паправлять тут нечего, всё верно, eax через стёк уходит в ebx, обмен произведён. к eax прибавляем ebx...
Замысловатее, но врят ли оптимальнее вроде как запись в папять происходит и по размеру кода выгоды нет.
Последний раз редактировалось master 30 ноя 2019, 13:40, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Оптимизация

Сообщение qwertylol » 12 янв 2008, 22:48

Мдя, я проверил . Мой комп выполняет 10 млн раз твой вариант за ~2.282 секунды, a мой за ~2.938 секунд. Замеры производились без учёта времени потраченного на цикл и вызовы GetTickCount().
З.Ы. Компилятор MVS 2003(C++).
З.Ы.Ы. Ho самый короткий и быстрый вариант это:

Код: Выбрать все

mov eax,233;
mov ebx,144;
Последний раз редактировалось qwertylol 30 ноя 2019, 13:40, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 28 гостей