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

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

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

Посл.отвђт Сообщен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 команды , или
ты просто не знал что к чему прибавляется?

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


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