Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

Хех... загадка :)   Найти похожие ветки 

 
Piter ©   (2006-03-03 00:41) [0]

Может ли в Delphi быть такое, что операция:

P := nil;

выполняется медленнее, чем, например:

P := Pointer($0000ABCD);

? :)


 
McSimm ©   (2006-03-03 00:42) [1]

Область видимости одинаковая ?


 
Piter ©   (2006-03-03 00:45) [2]

Область видимости P? Ну естественно.

Кстати, P: pointer


 
Piter ©   (2006-03-03 00:46) [3]

С "P" вообще ничего делать не надо, просто меняешь правую часть и получаешь замедление (если со второго варианта на первый)


 
Piter ©   (2006-03-03 00:47) [4]

Piter ©   (03.03.06 0:46) [3]
и получаешь замедление


естественно, не всегда, а при определенных условиях. И настройках :)


 
McSimm ©   (2006-03-03 01:01) [5]

Не знаю.
Делфи нет, а наугад сказать сложно.
При обычных условиях nil должен по идее заноситься с помощью очищенного аккумулятора, т.е. две операции, а константу вероятнее всего занесет одной операцией, но она тяжелее тех двух скорее всего.


 
McSimm ©   (2006-03-03 01:02) [6]

а при определенных условиях и настройках может всякое быть :)

Так что ответ на вопрос - может.
(и попробуй докажи, что я не правильно ответил :)


 
SkyRanger ©   (2006-03-03 01:10) [7]

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


 
Lamer@fools.ua ©   (2006-03-03 01:14) [8]

>Ну дык приведение типов вроде занимает больше памяти

Кхм...


 
Piter ©   (2006-03-03 01:15) [9]

Блин, ну ты умен... так нечестно :)

А я, судя по всему, лоханулся. Действительно, операций то будет две, но там ведь копирование из регистра в память, а в обратном случае из памяти в память, что, вероятно, медленее, чем две операции с регистром :(

Черт, ну ладно, еще раз убедился, что есть люди поумнее меня :)


 
Piter ©   (2006-03-03 01:16) [10]

это я к Максиму обращался в предыдущем посте :)


 
McSimm ©   (2006-03-03 01:21) [11]

>Ну дык приведение типов вроде занимает больше памяти

занимаемой исходником в редакторе ?
конечно :)


 
Lamer@fools.ua ©   (2006-03-03 01:22) [12]

>>Piter ©   (03.03.06 00:41)

Версия Delphi?
Оптимизация включена?

З.Ы.
Если оптимизация включена, то может быть, например, такое различие:
xor     eax, eax // Это быстрей должно быть
vs
mov     eax, $0000ABCD  // чем это

Если оптимизация выключена, то получим что-то вроде этого:
xor     eax, eax
mov     [ebp - $08], eax

vs
mov     [ebp - $08], $0000ABCD
Тогда первый вариант, вероятно, будет выполняться дольше.

З.Ы.Ы. IMHO, на современных процессорах говорить о скорости отдельно взятой операции вне контекста вообще не имеет смысла, учитывая спекулятивное выполнение, кеш инструкций и данных первого и второго уровней и прочая и прочая...


 
McSimm ©   (2006-03-03 01:39) [13]

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

Я совершенно не знаком с тонкостями современных процессоров, так, краем уха выидел :)
Скорее всего сейчас все действительно иначе.


 
Piter ©   (2006-03-03 02:11) [14]

Lamer@fools.ua ©   (03.03.06 1:22) [12]
Тогда первый вариант, вероятно, будет выполняться дольше.


ага, именно про это я и говорил, все правильно. НО. В посте [9] я описал уже, ступил. Думаю, что комманды работы над регистром:

Lamer@fools.ua ©   (03.03.06 1:22) [12]
xor     eax, eax
mov     [ebp - $08], eax


все равно будут выполнено быстрее, чем копирование из памяти в регистр:

Lamer@fools.ua ©   (03.03.06 1:22) [12]
mov     [ebp - $08], $0000ABCD


 
Piter ©   (2006-03-03 02:12) [15]

Piter ©   (03.03.06 2:11) [14]
чем копирование из памяти в регистр


тьфу, "чем копирование из памяти в память".


 
Piter ©   (2006-03-03 02:13) [16]

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


 
Lamer@fools.ua ©   (2006-03-03 09:24) [17]

>>Piter ©   (03.03.06 02:13) [16]

mov     [ebp - $08], $0000ABCD — не копирование из памяти в память.


 
wal ©   (2006-03-03 09:53) [18]


> mov     [ebp - $08], $0000ABCD — не копирование из памяти
> в память.
А откуда и куда?


 
MBo ©   (2006-03-03 10:09) [19]

procedure TForm1.Button4Click(Sender: TObject);
var
 t: Dword;
 i, m, c: Integer;
begin
 t := GetTickCount;
 c := t;
 for i := 0 to 2000000000 do
   m := c; //1
//    m := 0;//2
 //    m:=123456789;  //3
 Caption := Format("%d %d", [m, GetTickCount - t]);
end;

первые два варианта выполняются у меня в 1.5 раза быстрее третьего.
Код варианта //1 включает в себя копирование регистра, и занимает 2 байта.
Второго - xor, 2 байта
Третий вариант - загрузка в регистр НЕПОСРЕДСТВЕННОГО значения (immediate value), занимает 5 байт (код команды и сами данные)


 
MBo ©   (2006-03-03 10:10) [20]

>wal ©   (03.03.06 09:53) [18]
> mov     [ebp - $08], $0000ABCD — не копирование из памяти
> в память.
>А откуда и куда?

непосредственного значения в память


 
wal ©   (2006-03-03 10:17) [21]


> непосредственного значения
А непосредственное значение где находится?


 
McSimm ©   (2006-03-03 10:22) [22]

Есть терминология, данные могут быть в регистре, памяти или непосредственно в команде. Конечно, все это память (даже регистры, чем не память?). Но работа процессора с данными в области памяти и расположенными в коде разная.


 
wal ©   (2006-03-03 10:47) [23]


> [22] McSimm ©   (03.03.06 10:22)
> Есть терминология, данные могут быть в регистре, памяти
> или непосредственно в команде.
Терминология терминологией, но на низком уровне цикл выборки непосредственных данных и цикл выборки данных из памяти мало чем отличаются.

> Конечно, все это память (даже регистры, чем не память?).
Регистры - это тоже память (даже в какойто советской книге видел определение "сверхоперативное ЗУ"), но работа с ними в корне отличается от работы с ОЗУ и по времени и по принципам обращения.
> Но работа процессора с данными в области памяти и расположенными
> в коде разная.
Но это не делает память (ОЗУ) непамятью (неОЗУ) ;)

С уважением.


 
Lamer@fools.ua ©   (2006-03-03 11:01) [24]

>>wal ©   (03.03.06 10:47) [23]

>но на низком уровне цикл выборки непосредственных данных и цикл выборки данных из памяти мало чем отличаются.

Если команда уже выбрана процессором, то дополнительного чтения для значения типа immediate, вероятно, уже не потребуется.

>>MBo ©   (03.03.06 10:09) [19]

GetTickCount() --> GetThreadTimes()


 
wal ©   (2006-03-03 11:05) [25]


> Если команда уже выбрана процессором ...
Длинная команда вибирается не за один цикл выборки.


 
Lamer@fools.ua ©   (2006-03-03 11:53) [26]

>>wal ©   (03.03.06 11:05) [25]

См. З.Ы.Ы. к [12] :-)


 
Piter ©   (2006-03-03 13:38) [27]

Хех, так прав я был или нет? :)

Давайте сформулирую, что быстрее все таки:

1) копирование из кода в память

или

2) XOR над регистром и копирование из регистра в память?

С учетом всех побочных эффектов, аля выборки из памяти.

Вопрос не научный, просто интересно.


 
MBo ©   (2006-03-03 13:42) [28]

>Piter ©   (03.03.06 13:38) [27]
>1) копирование из кода в память

?
Переформулируй


 
Crash Coredump ©   (2006-03-03 13:53) [29]

Piter ©   (03.03.06 13:38) [27]

А в связи с чем возник изначальный вопрос, если не секрет ? А то тут народ копья ломает...


 
Piter ©   (2006-03-03 16:04) [30]

MBo ©   (03.03.06 13:42) [28]
Переформулируй


блин, ну я уж не знаю как назвать :)

Вот про это:

mov     [ebp - $08], $0000ABCD

Ну если угодно, из комманды в память.

Не знаю как по другому сказать.


 
Piter ©   (2006-03-03 16:05) [31]

Crash Coredump ©   (03.03.06 13:53) [29]
А в связи с чем возник изначальный вопрос, если не секрет ?


а вроде как вопроса и нету. Делюсь впечатлениями, а потом вот уже возник вопрос :)


 
Marser ©   (2006-03-03 16:11) [32]

Удалено модератором
Примечание: Offtopic


 
MBo ©   (2006-03-03 16:19) [33]

>Ну если угодно, из комманды в память.
В интеловской терминологии это immediate value - непосредственное значение. Само это число содержится прямо в машинном коде. Оптимизирующий компилятор обычно заменяет загрузку непоср. значения 0 на xor, но другие значения - так и остаются.


 
Marser ©   (2006-03-03 16:34) [34]

Удалено модератором


 
Piter ©   (2006-03-03 17:03) [35]

MBo ©   (03.03.06 16:19) [33]

это и так понятно. Но вопрос в [27] :)


 
Игорь Шевченко ©   (2006-03-03 17:06) [36]


> Давайте сформулирую, что быстрее все таки:


XOR быстрее. Иначе эта конструкция не использовалась бы оптимизирующим компилятором


 
Piter ©   (2006-03-03 17:16) [37]

Игорь Шевченко ©   (03.03.06 17:06) [36]
XOR быстрее. Иначе эта конструкция не использовалась бы


логика, конечно, есть. И будет несомненно быстрее, если переменная хранится в регистре.

xor ecx, ecx

быстрее, чем:

mov ecx, $0

Но а вот когда идет еще и запись в память помимо xor"а...


 
Игорь Шевченко ©   (2006-03-03 17:26) [38]

Piter ©   (03.03.06 17:16) [37]


> Но а вот когда идет еще и запись в память помимо xor"а..
> .


Вот смотри:

в память можно записать из регистра

xor eax,eax // именно eax, по возможности
mov [some_mem],eax

или

mov [some_mem],0

Разработчики компилятора используют первый вариант.

Отгадай, почему ?


 
Piter ©   (2006-03-03 17:41) [39]

Игорь Шевченко ©   (03.03.06 17:26) [38]
Отгадай, почему ?


А потому что во многих случаях переменная хранится в регистре, тогда преимущество первого способа несомненно:

xor eax, eax

перед:

mov eax, 0

Когда же переменных много и приходится результат списывать в память:

xor eax, eax
mov $blabla, eax

уже неочевидно быстрее, чем просто:

mov $blabla, $0


 
Игорь Шевченко ©   (2006-03-03 17:45) [40]

Piter ©   (03.03.06 17:41) [39]


> А потому что во многих случаях переменная хранится в регистре,
>  тогда преимущество первого способа несомненно:


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

Насчет неочевидности - марш на сайт Интел. Бегом.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.047 c
15-1141278010
DelphiN!
2006-03-02 08:40
2006.03.26
Нет ли у кого ф-ии для подсчета значения выражения


4-1136329563
SpyBoy
2006-01-04 02:06
2006.03.26
TSearchTypes


8-1129731831
Torvald
2005-10-19 18:23
2006.03.26
EnumSurfaces в контексте потока чужего процесса


15-1141168449
Teapot
2006-03-01 02:14
2006.03.26
Помогите злому начинающему!


8-1129642025
фывыч
2005-10-18 17:27
2006.03.26
про HWaveOut





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский