![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Pointer->Integer->Pointer
alertus © (2005-05-27 17:36:00)Подскажите, пожалуйста, если я пишу так:
a:^real;
p:^real;
....
getmem(a,100*sizeof(real));
p:=pointer(integer(a)+0);
p^:=0.347;
p:=pointer(integer(a)+8);
p^:=0.764;
p:=pointer(integer(a)+16);
p^:=0.764;
....
Похоже ли это на работу динамического массива и какова будет разница в скорости??
begin...end (2005-05-28 10:55:00) [21]> Defunct © (27.05.05 23:45) [39]
> Промолчу, если вы заметили, я уже стараюсь с вами не спорить.
Теперь смотрим, что же было в посте [36], на который Вы "промолчали":
1. Результаты, опровергающие Ваши утверждения (даже с отключённой оптимизацией вариант с умножением проиграл).
2. Уличение Вас во лжи насчёт отсутствия хинтов (их просто не могло не быть, или они были отключены).
Поэтому молчание только подтверждает Ваше стремление изворачиваться и патологическое нежелание признавать свои ошибки.
> Для получение объективного результата проверьте в равных
> условиях команды
>
> mov eax, [I + ESP + ECX*8]
> и
> mov eax, [I + ESP + ECX]
>
> т.е. сугубо наличие умножения индекса.
Если нужно проверить команды, отличающиеся только наличием умножения индекса, то зачем тогда константа I? Команды, отличающиеся только наличием умножения, уже проверялись в Вашем коде [28], результаты выполнения которого были приведены мной в [31] и [36] (с включённой и отключённой оптимизацией, соответственно).
Сорри, но прогонять Ваши тесты уже надоело. Судя по тому, как Вы были уверены в результате, в [36] вариант с умножением должен был выиграть. Однако этого не произошло.
Что касается способа измерения времени, то не удивлюсь, если в следующий раз Вы будете использовать часы с кукушкой.
Судя по [33], автору вопроса мой совет помог, а для меня это в этой ветке -- главное.
Defunct (2005-05-28 01:27:00) [22]Marser © (28.05.05 01:22) [59]
Помоему и так все цивилизовано решилось.
"Мир! Дружба! Жвачка!" :) поговорка со времен когда жвачка стоила гораздо больше булки хлеба.
Marser (2005-05-28 01:22:00) [23]Але я вам щиро не раджу цього робити... Зайвий ворог, та ще й на рівному місці...
Marser (2005-05-28 01:20:00) [24]Добре. Можете мене записати в свої одвічні вороги, якщо вам так кортить.
Defunct (2005-05-28 01:17:00) [25]Marser © (28.05.05 01:09) [56]
Да ладно там :) Куда уж отпираться-то.
Marser © (27.05.05 23:50) [40]
> Действительно ламерство.
Defunct © (28.05.05 00:10) [42]
> Это мне?
Marser © (28.05.05 00:12) [43]
> У бегиныча я пробелов не наблюдал. Были какие-то мелочные проколы, но программное время с помощью TDateTime он не измерял...
Marser (2005-05-28 01:09:00) [26]
> Вот, поэтому может быть не стоит делать поспешных
> выводов о ламерстве?
А я о ламерстве конкретно вашем ничего и не говорил. На злодієві шапка горить? ;-)
Defunct (2005-05-28 01:04:00) [27]Marser © (28.05.05 01:01) [53]
> Я кокретный пример не рассматривал.
Вот, поэтому может быть не стоит делать поспешных выводов о ламерстве?
Defunct (2005-05-28 01:02:00) [28]ZlDoc © (28.05.05 00:49) [51]
Ну так при измерении были приостановлены почти все процессы, и заметьте результат получился дважды одинаковым. (при первом тесте случайно дернул мышку).
Marser © (28.05.05 00:47) [50]
> Крооме того, для кратковренных засечек измерений в милисекундах(gettickcount) вполне достаточно.
Загляните в [30], ~45 секунд это кратковременная засечка? С точностью до сотых секунды NOW вполне достаточно.
Marser (2005-05-28 01:01:00) [29]
> Defunct © (28.05.05 0:55) [52]
Допустим, что так. Я кокретный пример не рассматривал. В общем случае GetTickCount эффективнее, а также проще.
Defunct (2005-05-28 00:55:00) [30]Marser © (28.05.05 00:47) [50]
Спасибо что вы привели код функции Now, но опять-таки пусть 1000 команд, пусть 10000 (хотя на самом деле их там меньше), против 2.2*10^11 (кол-во команд в цикле), это вы сами понимаете фактически 0.
Добавляем сюда систематичность - и первый тест и второй измерялся одинаковыми средствами, в итоге получаем адекватный для сравнения результат.
ZlDoc (2005-05-28 00:49:00) [31]Defunct ©
Ok. Возможно я не прав. (Но точно помню где-то читал что сначала вычисляется адрес)
Но всеравно мерить не выход. Ведь Win среда многозадачная, и праллельно с измерениями выполняются еще 2 десятка процессов + некоторые с RalTime приоритетом. Много опытов придется ставить чтоб чего то достоверное получить.
Marser (2005-05-28 00:47:00) [32]Вот неполное изложение того, во что выливается Now:
function Now: TDateTime;
{$IFDEF MSWINDOWS}
var
SystemTime: TSystemTime;
begin
GetLocalTime(SystemTime);
with SystemTime do
Result := EncodeDate(wYear, wMonth, wDay) +
EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
end;
function EncodeDate(Year, Month, Day: Word): TDateTime;
begin
if not TryEncodeDate(Year, Month, Day, Result) then
ConvertError(@SDateEncodeError);
end;
function TryEncodeDate(Year, Month, Day: Word; out Date: TDateTime): Boolean;
var
I: Integer;
DayTable: PDayTable;
begin
Result := False;
DayTable := @MonthDays[IsLeapYear(Year)];
if (Year >= 1) and (Year <= 9999) and (Month >= 1) and (Month <= 12) and
(Day >= 1) and (Day <= DayTable^[Month]) then
begin
for I := 1 to Month - 1 do Inc(Day, DayTable^[I]);
I := Year - 1;
Date := I * 365 + I div 4 - I div 100 + I div 400 + Day - DateDelta;
Result := True;
end;
end;
function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;
begin
if not TryEncodeTime(Hour, Min, Sec, MSec, Result) then
ConvertError(@STimeEncodeError);
end;
function TryEncodeTime(Hour, Min, Sec, MSec: Word; out Time: TDateTime): Boolean;
begin
Result := False;
if (Hour < 24) and (Min < 60) and (Sec < 60) and (MSec < 1000) then
begin
Time := (Hour * 3600000 + Min * 60000 + Sec * 1000 + MSec) / MSecsPerDay;
Result := True;
end;
end;
Вот вам и ничего лишнего...
При кратковременных засечках это даёт очень большую погрешность. Крооме того, для кратковренных засечек измерений в милисекундах(gettickcount) вполне достаточно.
> Тем более под общую шумиху, впринципе ваше поведение
> было ожидаемо.
Моё - нет :-)
Defunct (2005-05-28 00:41:00) [33]Marser © (28.05.05 00:32) [48]
Я не хочу никого выставить ламером,
ошибаются все. Тем более под общую шумиху, впринципе ваше поведение было ожидаемо.
Но, обратите внимание сюда:
T1 := now;
цикл
T2 := now;
Ничего лишнего, кроме засечения времени старта и останова.
Наличие запущеных сервисов под winxp дадут куда большую погрешность чем погрешность, получаемая за счет времени затрачиваемого на конвертирование показаний сист. таймера в TDateTime. Тем более погрешность эта систематическая, и для первого и для второго тестов одинакова, соответственно на точность результата никак не влияет.
Далее, уже после того как измерения произведены идет отображение на экран, при этом на не волнует как долго будет длиться этот процесс.
Marser (2005-05-28 00:32:00) [34]
> 1. функции QueryPerformanceTimer нет.
QueryPerformanceCounter, уж простите великодушно.
> 2. GetTickCount и Now изменяются с одинаковой
> точностью.
А скорость? GetTickCount это один элементарный системный вызов. А у Вас кроме того ещё и FormatDateTime используется.
> 3. Вы просто так оскорбили меня на ровном месте.
1. Не на ровном.
2. Не оскорбил.
3. Всё равно прошу прощения.
Defunct (2005-05-28 00:29:00) [35]ZlDoc © (28.05.05 00:09) [41]
> несколько тактов чтоб I + ESP + ECX посчитать
Не нужно, потому что для вычисления адреса не используется обычное АЛУ, а используется дополнительный сумматор/вычислитель адреса, учитывая конвеерную организацию процессора, вычисление адреса и действие АЛУ выполняются параллельно.
Defunct (2005-05-28 00:22:00) [36]Marser © (27.05.05 23:50) [40]
Теперь уже вас спрашиваю, вам не стыдно такое писать?
1. функции QueryPerformanceTimer нет.
2. GetTickCount и Now изменяются с одинаковой точностью.
3. Вы просто так оскорбили меня на ровном месте.
Defunct (2005-05-28 00:20:00) [37]Marser © (28.05.05 00:12) [43]
А какая разница с помощью чего измерять время если мне хватает точности. Ведь на фоне 2*~110 Млрд инструкция, два обращения к системному таймеру, роли не играет. Тем более, Now изменяется с каждым тиком таймера, вот и скажате, какой смысл использовать GetTickCount который выдает какие-то значения в "попугаях", когда я вам вывел время более привычных секундах с такой же точностью как begin...end (вы сказали без проколов) с помощью GetTickCount.
Или "глубочайшие знания у тебя соседствуют с пробелами чуть ли не в табличке умножения" (C) Marser?.
Marser (2005-05-28 00:13:00) [38]
> PS. Быстрее ассемблера ничего не придумали...
Фронт прямоугольного импульса (С)
:о)
Marser (2005-05-28 00:12:00) [39]
> Defunct © (28.05.05 0:10) [42] [Новое
>сообщение][Ответить]
>Marser © (27.05.05 23:50) [40]
>
> Это мне?
У бегиныча я пробелов не наблюдал. Были какие-то мелочные проколы, но программное время с помощью TDateTime он не измерял...
Defunct (2005-05-28 00:10:00) [40]Marser © (27.05.05 23:50) [40]
Это мне?