· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Brain vs C compiler

<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . >>

Посл.отвђт Сообщенiе


Дата: Сен 6, 2003 07:47:04 · Поправил: Artem

Fixer
Это не оптимизация, оптимизированный кусок должен быть примерно такой:
if (Сount) do {} while((!(Blocks[a].SomeField==Value))&&(++a - Count));


Во-первых, я не утверждал, что один из приведённых мной вариантов является вообще самым оптимальным, я всего лишь сравнил ЭТИ три варианта! Во-вторых по поводу твоего варианта. ОН НИЧУТЬ НЕ ОПТИМАЛЬНЕЙ МОЕГО, а выглядит ужасно! Любой ассемблерщик знает, что a-Count!=0 (<0), это то же самое, что a<Count, т.к. cmp - это тот же sub.

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

Можно и он будет быстрее, но это выражение нужно будет записать в две строчки :).


Складывается впечатление, что такие понятия, как стиль программирования, красота, ясность и читабельность кода, тебе не знакомы. Ты, наверное, в своих программах пишешь по 10 операторов в одной строке? Когда-то много лет назад я тоже частенько писал длинные строки. Но с появлением опыта это прошло.
И почему это оператор break - варварский?

volodya
Только и твой вариант можно улучшить - заменить Blocks[a].SomeField==Value на вариант с поинтером - будет еще быстрее.
Как я написал в своём первом сообщении - не обязательно.


Дата: Сен 6, 2003 11:21:29

Artem
ОН НИЧУТЬ НЕ ОПТИМАЛЬНЕЙ МОЕГО
Посмотри в отладчике ассемблерный код это будет лучшим ответом. Или Borlad'овский компилятор думает иначе :).

т.к. cmp - это тот же sub
Согласен, перемудрил :). Даже скажу тебе больше (++a<Count) лучше чем (++a-Count) в смысле порождаемого ассемблерного кода.

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

Когда-то много лет назад я тоже частенько писал длинные строки. Но с появлением опыта это прошло.
Ну вообще с возрастом у нас много что проходит ;). Я не пишу длинных строк, я пытаюсь написать код так, чтобы каждая строка несла в себе какойто смысл. Я исхожу из того что человек за раз может воспринимать от 7 до 14 единиц информации.
Я не думаю что мой более чем дестилетний опыт программирования на C (и более 7 лет в сфере производства ПО) является таким уж маленьким

И почему это оператор break - варварский
Он разрушает естественный ход выполнения програм эквивалентен оператору goto. Его наличие показывает изъян в алгоритме.

Ну как говориться это уже другой разговор


Дата: Сен 6, 2003 15:06:41 · Поправил: masquer

человек за раз может воспринимать от 7 до 14 единиц информации
Если речь идет о кошельке Миллера - то 7(+/-)2 единицы.

Его наличие показывает изъян в алгоритме.
Очень спорный вопрос.


Дата: Сен 6, 2003 15:09:11 · Поправил: Fixer

masquer
14 - это с запасом для гениев ;)

При наличие оператора break очень сильно затрудняется анализ программы (т.к. при отсутствии break достаточно проанализировать только условие выхода в операторе цикла, а тут придется лазить по всему телу цикла выискивая условия выхода). В классической парадигме программирования предполагается, что выход из цикла возможен по условию указанному в качестве параметра цикла. И вообще можно обойтись без циклов и без break
_beg_loop:
   ...
   оператор
   ...
   if (выражение1) goto _end_loop
   ...
   if (выражение2) goto _beg_loop
_end_loop:

Чем это хуже циклов с break.

У оператора break свое применение, он предназначен прежде всего для case (в этом случае он может быть заменен также goto).

Это всего лишь мое мнение


Дата: Сен 6, 2003 15:32:31

Fixer
Скорее не для гениев, а для людей с особенными возможностями %)))
Хотя я пока из таких только женщин встречаю :)))


Дата: Сен 6, 2003 16:01:28 · Поправил: masquer

Fixer
Простейший пример
value=0;
if Cond1 & Cond2
{
// здесь какой-то расчет значения value, при определенном значении которого нужно выйти
if value==a break;
// дальнейший расчет
}


То же самое можно с for и while придумать. В отдельных случаях его можно избежать, а в отдельных - нет. Так что его наличие - не обязательно изъян алгоритма.
p.s. я на си не пишу вобщем-то :)


Дата: Сен 6, 2003 16:23:36 · Поправил: Fixer

masquer
if Cond1 & Cond2 & !(mathValue()==a)
{
// дальнейший расчет
}
break не нужен


Дата: Сен 6, 2003 16:30:30

Может я чего не так понимаю, но !(mathValue()==a - будет проверяться в начале if, а если мне нужно отследить это условие в середине расчета - как тогда?


Дата: Сен 6, 2003 16:44:21

Был когда-то (вернее и сейчас есть) программный продукт TeX (незнаю как его назвать наверное: компилятор текста) так вот когда на выходе получались разреженные строки в книге Шеня рекомендовалось переформулировать целиком всю фразу. Тут тоже лучше следовать этим рекомендациям.

Можешь поверить мне, я уже давно пишу на C и честно говоря ни разу не сталкивался с подобными проблемами


Дата: Сен 6, 2003 17:01:43 · Поправил: Fixer

Кстати не обратил внимание употребление break возможно только в теле циклов и конструкции switch.

Его наличие показывает изъян в алгоритме.
Хотел бы поправиться: его наличие показывает изъян в реализации алгоритма.


Дата: Сен 6, 2003 20:47:59

Ещё пара интересных решений:
eax a
edx b
6 bytes:

again:
xchg edx,eax
inc edx
jz again
dec edx
xchg edx,eax

cmp eax, -1
jne exit
sub eax, edx
jz exit
not eax
exit:


Дата: Сен 8, 2003 07:15:39 · Поправил: Artem

Fixer
Посмотри в отладчике ассемблерный код это будет лучшим ответом.
Лучший ответ - это время выполнения, а оно не меняется (ну разве что на несколько наносекунд - ведь эффект должен теоретически проявляться только в последней итерации цикла).

Более компактный код как правило более читабелен.
Только в том случае, если под компактностью понимать меньшее количество операций, а не "упаковка" нескольких строчек кода в одну.

Он разрушает естественный ход выполнения програм эквивалентен оператору goto. Его наличие показывает изъян в алгоритме.
Существует большое количество алгоритмов, которые нельзя реализовать без break, поэтому твоя мысль явно не верна.

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

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


Дата: Сен 8, 2003 10:47:35 · Поправил: Fixer

Лучший ответ - это время выполнения, а оно не меняется

А ты проверял? ;)

Только в том случае, если под компактностью понимать меньшее количество операций, а не "упаковка" нескольких строчек кода в одну.

Если для тебя лучше
if (Сount)
   do {
   } while((!(Blocks[a].SomeField==Value))&&(++a - Count)); 


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

Существует большое количество алгоритмов, которые нельзя реализовать без break

Приведи хоть один в подтверждении своей мысли.

Может, ты просто не писал сложные программы?

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


Дата: Сен 8, 2003 12:23:15 · Поправил: boozook

The Svin
Первое решение не всегда приемлемо - оно модифицирует edx. Однако, красивое...

Еще вариант без прыжков:
			;a=-1	a!=-1
cmp eax,-1
sbb ecx,ecx		;0	;-1
sub eax,b	;a-b
and eax,ecx		;0	;a-b
add eax,b		;b	;a
sub eax,-1
sbb eax,0


Дата: Сен 8, 2003 12:39:17

boozook
Хорошее решение - уже 3 такта! Модификация edx вполне допустима, я в него b запихиваю :)

<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.051