Страница 1 из 8

Оптимизация

Добавлено: 09 янв 2008, 03:18
qwertylol
Я тут увидел у вас задачку по, не побоюсь этого слова, программированию. Вот тоже решил запостить довольно интересную, на мой взгляд, задачку. Цель- опитмизировать код, т.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: .

Оптимизация

Добавлено: 09 янв 2008, 05:47
master
qwertylol писал(а):Source of the post

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

 n=A&0x3f;


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

Оптимизация

Добавлено: 09 янв 2008, 13:18
qwertylol
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 верный ответ вы уже знали, или сами к нему пришли?

Оптимизация

Добавлено: 09 янв 2008, 14:10
Soul
"else if(!a && B!=0)"
Язык регистрозависимый или нет? Я так понимаю здеь A тоже, что и в других выражениях?

Оптимизация

Добавлено: 09 янв 2008, 14:16
qwertylol
Да, C- это регистрозависимый язык. Набивал всё руками, отсюда и опечатка. Уже подправил.

Оптимизация

Добавлено: 12 янв 2008, 19:23
Draeden
хммм... 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

Оптимизация

Добавлено: 12 янв 2008, 20:44
master
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

Оптимизация

Добавлено: 12 янв 2008, 22:20
qwertylol
Мдя, к стыду своему я асм пока не осилил, но мне кажется, что в данном случае можно сделать так:

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

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 установлен).

Оптимизация

Добавлено: 12 янв 2008, 22:33
master
Да паправлять тут нечего, всё верно, eax через стёк уходит в ebx, обмен произведён. к eax прибавляем ebx...
Замысловатее, но врят ли оптимальнее вроде как запись в папять происходит и по размеру кода выгоды нет.

Оптимизация

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

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

mov eax,233;
mov ebx,144;