|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 3, 2003 09:13:53 · Поправил: Fixer Artem Это не оптимизация, оптимизированный кусок должен быть примерно такой: if (Сount) do {} while((!(Blocks[a].SomeField==Value))&&(++a - Count)); |
|
|
Дата: Сен 3, 2003 11:34:41 volodya компилятор никто и не обвинял - тяжело представить компилятор, который будет ТАК оптимизировать. |
|
|
Дата: Сен 3, 2003 13:20:29 Asterix Процессор: P6 (!!!) Это вносит некоторые ограничения.. Однако, уже счастливые обладатели новейших Celeron366 могут себе позволить использовать эту инструкцию :) Версия с прыжком: cmp eax,-1 jne exit xor eax,b cmovne eax,b exit: Без прыжков(!!!): cmp eax,-1 cmove eax,b sub eax,-1 sbb eax,0 |
|
|
Дата: Сен 3, 2003 13:36:59 boozook Нельзя расчитывать, что у твоих юзеров будет проц с поддержкой набора инструкций, отличного от 486. Ну и полета мысли никакого нет :)))) Кстати, такой код (без прыжка) занимает 2 такта на атлоне. |
|
|
Дата: Сен 3, 2003 14:35:48 masquer Нельзя расчитывать Как это нельзя? IMHO эта инструкция СПЕЦИАЛЬНО разработана для избежания условных переходов... А команда CPUID позволяет ее обнаружить 2 такта на атлоне ессно 4 инструкции не могут вместиться в 1такт :)) Кстати этот код еще и занимает 13байт |
|
|
Дата: Сен 3, 2003 14:42:42 Как это нельзя? Просто - нельзя. Перечитай мой предыдущий пост. |
|
|
Дата: Сен 3, 2003 17:09:00 Fixer volodya А помоему моё решение с jmp красивее и лучше ваших обоих на С %)) Правда хуже The Svin %))) Ох уж эти переходы %)) |
|
|
Дата: Сен 3, 2003 19:46:06 masquer Так можно? ... fPro proc ... cmp eax,-1 cmove eax,b sub eax,-1 sbb eax,0 ... ret fPro endp f486 proc ... .if eax==-1 mov eax,b .if eax==-1 xor eax,eax .endif .endif ... ret f486 endp start: mov eax,1 cpuid shr eax,8 and eax,15 .if eax>4 ;процессор старше 486 and edx,100000000000000b .if ZERO? ; проверка поддержки CMOVCC mov f,offset f486 .else mov f,offset fPro .endif .endif ... call f ... можно еще самомодифицирующийся код сделать, но лучше всего 2 exe-шника Edmond красивее, лучше... мое быстрее :) |
|
|
Дата: Сен 3, 2003 20:38:33 · Поправил: volodya boozook Твое не может быть быстрее в принципе, т.к. использует .if/.endif - лучше уж на С оставить. Но. Идея с cmovcc и проверкой на тип процессора - ничего. В определенных условиях, как твоя частная утилита, может и пройдет. И еще - худший кошмар для оптимизации, чем SMC сложно представить. Во всех мануалах по интел сказано, что избегайте SMC! Как изволите прыжок предсказывать? Как изволите инструкции выравнивать? Ты здесь дезинфу не разводи! |
|
|
Дата: Сен 3, 2003 20:39:58 Fixer Цикл с постусловием, ессно, будет выполнятся быстрее. Только и твой вариант можно улучшить - заменить Blocks[a].SomeField==Value на вариант с поинтером - будет еще быстрее. |
|
|
Дата: Сен 3, 2003 21:38:14 Сегодня спросил ребёнка, почему тебе не хочется писать на Паскале или С? Ответ поразил (цитирую буквально буква в букву): Во первых неинтересно. Во вторых меньше понятно. В третьих боишься как бы компилятор не сделал что то неправильно. Слова 7и летнего ребёнка. Правда учили его не так как написано в книжках. Он например чётко понимает что не каких "переходов" реально не существует. Существует IP по адрессу которого выполняется команда, и арифметические правила изменения IP, автоматически: текущие значение + размер текущей команды, или автоматически + значение из специальных команд, или загрузка в него значения командой. |
|
|
Дата: Сен 3, 2003 21:48:40 The Svin Жалко малчика(надеюсь не девочка?) volodya немного поясню Те .if/.endif, что внутри f486 просто еще не оптимизированы (не хочу нарушать законы АП) :)))) проверкой на тип процессора Не думаю, что это моя идея :) В определенных условиях, как твоя частная утилита, может и пройдет щутку понял... остро SMC, прыжки, выравнивание В приципе это все хоть и изврат, но выполнимо.. и даже плюсы свои есть - пусть хакеры потом думают какого это надо З.Ы. не хотел ни кого провоцировать использовать SMC, сори если кто от этого пострадает |
|
|
Дата: Сен 3, 2003 22:08:17 volodya Ясно дело можно, просто человек имея условие внутри цикла (и употребляя варварский оператор break) назвал это решение оптимизированным, хотя подобное условие необходимо помещать внутрь проверки на выход из цикла. Только и твой вариант можно улучшить - заменить Blocks[a].SomeField==Value на вариант с поинтером - будет еще быстрее. Можно и он будет быстрее, но это выражение нужно будет записать в две строчки :). |
|
|
Дата: Сен 3, 2003 22:58:36 · Поправил: Fixer The Svin Ребенок мал еще, не пьет пиво, не встречается с девушками... не ценит время ;). |
|
|
Дата: Сен 3, 2003 23:09:57 · Поправил: The Svin Жалко малчика(надеюсь не девочка?) Себя пожалей, он занимается только тем что ему интересно и ровно столько сколько ему интересно. Если ему кодировать машинные команды в кайф а тебе мука, то кого жалеть из вас становится ясно. Тебе с образованием просто не повезло видимо. Доходить пришлось до всего своим умом и по книжкам кривым. Вот и кажется видимо что в 7лет интересней в песочнице ковыряться. Ему интересней ковырятся в битиках. А на компе у него есть и игрушки и другое, и в корридоре велосипед,и в комнате макиввара, а в другой пианино. Никто его в свободное от школы времени не заставляет вычистлять отностительное смещение после кода E2, он сам приходит с вопросами по этому поводу. У меня только один вопрос возникает после подобных иронических высказываний, если низкоуровневое кодирование кажется таким скучным и трудным, какого хрена им заниматься то? Тебе что трудно для первокласника кажется прибавить 2а к текущему IP чтобы вычислить адрес следующей после E2 XX команды , или ты просто не знал что к чему прибавляется? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.047 |