Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
Внизпеременная string. Поменять местами некоторые данные Найти похожие ветки
← →
Jeer © (2005-05-20 18:08) [40]Defunct:
0 [ns] - s2 := PChar(s1);
0 [ns] - w := PWord(@s2[0])^;
12 [ns] - PWord(@s2[0])^ := PWord(@s2[3])^;
45 [ns] - PWord(@s2[3])^ := w;
← →
Jeer © (2005-05-20 18:11) [41]Sha:
0 [ns]- p:=pointer(s);
0 [ns]- q:=p+3;
0 [ns]- w:=pword(p)^;
10[ns]- pword(p)^:=pword(q)^;
44[ns]- pword(q)^:=w;
← →
Sha © (2005-05-20 18:11) [42]> Jeer © (20.05.05 18:04) [39]
44 нс на 2ГГц пентиуме - это 88 тактов CPU.
Не могут 6 мувов в цикле исполняться такое время.
← →
Sha © (2005-05-20 18:12) [43]Ты чем таким меришь, что у тебя такая дискретность?
← →
Jeer © (2005-05-20 18:13) [44]Jeer:
6 [ns]- s[3] := s[1];
11[ns]- s[6] := s[2];
17[ns]- s[1] := s[4];
24[ns]- s[2] := s[5];
30[ns]- s[4] := s[3];
35[ns]- s[5] := s[6];
44[ns]- s[3] := ".";
49[ns]- s[6] := ".";
← →
Jeer © (2005-05-20 18:17) [45]QueryPerformanceCounter;
Допускаю, конечно, наличие систематического сдвига.
← →
Sha © (2005-05-20 18:18) [46]> Jeer © (20.05.05 18:17) [45]
Код приведи.
← →
Jeer © (2005-05-20 18:19) [47]Так это выглядит:)
N := 10000001;
tm.Clear;
tm.Start;
for i:=1 to N do begin
s[3] := s[1];
s[6] := s[2];
s[1] := s[4];
s[2] := s[5];
s[4] := s[3];
s[5] := s[6];
s[3] := ".";
s[6] := ".";
end;
tm.Stop;
← →
Sha © (2005-05-20 18:26) [48]Ну так ты меришь накладные расходы на организацию выполнения цикла :)
А время пустого оператора получилось равным нулю из-за оптимизатора, который выбросил цикл нафиг.
Попробуй своим способом измерить время работы оператора nop (0.5 такта CPU):asm nop; end;
← →
default © (2005-05-20 18:44) [49]Sha © (20.05.05 17:43) [33]
"Локальные просто ссылаются на RO-строку (отсюда AV)"
"а глобальные копируют ее содержимое (поэтому все работает)."
зачем такое разделение?
кстати если локальной строке присвоить константу, то её счётчик ссылок равен $FFFFFFFF и AV в результате
если же попытатьcя изменить нелегеально значение строки, к примеру, со счётчиком ссылок 3, то нет никакого AV-а
:(
← →
default © (2005-05-20 18:45) [50]Sha © (20.05.05 17:43) [33]
"Локальные просто ссылаются на RO-строку (отсюда AV)"
"а глобальные копируют ее содержимое (поэтому все работает)."
зачем такое разделение?
кстати если локальной строке присвоить константу, то её счётчик ссылок равен $FFFFFFFF и AV в результате
если же попытатьcя изменить нелегеально значение строки, к примеру, со счётчиком ссылок 3, то нет никакого AV-а
:(
← →
Sha © (2005-05-20 18:51) [51]> default © (20.05.05 18:44) [49]
> "Локальные просто ссылаются на RO-строку (отсюда AV)"
> "а глобальные копируют ее содержимое (поэтому все работает)."
> зачем такое разделение?
Думаю, для совмести со старыми версиями.
> кстати если локальной строке присвоить константу, то её
> счётчик ссылок равен $FFFFFFFF и AV в результате
Ну, так я тебе сказал то же самое: RO-константы имеют счетчик ссылок -1.
> если же попытатьcя изменить нелегеально значение строки,
> к примеру, со счётчиком ссылок 3, то нет никакого AV-а
Ну ты понимаешь, конечно, что тем самым ты меняешь значения 3-х строк, а не одной? :)
← →
default © (2005-05-20 18:53) [52]+[50]
"кстати если локальной строке присвоить константу, то её счётчик ссылок равен $FFFFFFFF и AV в результате
если же попытатьcя изменить нелегеально значение строки, к примеру, со счётчиком ссылок 3, то нет никакого AV-а"
вот это кажется понял - в первом случае AV из-за изменения константы, во втором это уже не константа хоть и строка RO
первый вопрос остаётся?
почему глобальная переменная сразу готова к изменению, для локальной же обязательно избавляться от RO?
← →
default © (2005-05-20 18:56) [53]RO я понимал как Read Only(RefCount>1)
сначала подумал что RO это ReferenceOne:)
"Ну ты понимаешь, конечно, что тем самым ты меняешь значения 3-х строк, а не одной? :)"
да, конечно
RO-константы расшифруйте(
← →
default © (2005-05-20 19:00) [54]вообщем всё понял
← →
Sha © (2005-05-20 19:02) [55]> RO-константы расшифруйте(
Строки, которые при загрузке экзешника, размещаются на странице
памяти с доступом только на чтение.
Всегда имеют счетчик ссылок, установленный в -1.
← →
default © (2005-05-20 19:05) [56]Sha © (20.05.05 19:02) [55]
угу
это разделение нелогичное, конечно, впечатлило...
← →
evvcom © (2005-05-20 22:36) [57]Добрался до машины с Delphi... посмотрел CPU. Да... Век живи, век учись.
← →
Defunct © (2005-05-21 01:20) [58]> Jeer
Я, к сожалению, в этой ветке не участвовал ;>
Все лавры господину default"у!
PS: спасибо, что обо мне вспомнили, :)
← →
Jeer © (2005-05-23 10:36) [59]К сожалению, в пятницу, при проверке вышеприведенных методов система пребывала, как оказалось, в странном состоянии.
Собственно, это было видно по цифрам - явно разные по количеству тактов тесты стали давать примерно одинаковый результат.
(хотя для Marser и Jeer были сделаны верные оценки)
Дома, на досуге, перепроверил и, с учетом вызовов RDTSC,
function GetCPUTicks_:int64;
asm
dw 310Fh // rdtsc
end;
, а также затрат на организацию цикла получаем:
Marser is = 2941.30 ns
Tcall is = 88 ticks
Tcycle is = 2 ticks
Ttest is = 5941 ticks
Jeer is = 47.53 ns
Tcall is = 88 ticks
Tcycle is = 2 ticks
Ttest is = 96 ticks
Sha is = 1.49 ns
Tcall is = 88 ticks
Tcycle is = 2 ticks
Ttest is = 3 ticks
Default is = 4.95 ns
Tcall is = 88 ticks
Tcycle is = 2 ticks
Ttest is = 10 ticks
Общее время теста выбиралось менее системного кванта (10 ms на w2k), чтобы снизить вероятность переключения задач.
Для коротких тестов, вполне можно сделать расчет вручную по тактам.
Вполне понятно, что не ставилась задача выявления лучшего/худшего алгоритмов.
Просто из "невинного" вопроса появилась возможность продемонстрировать разные способы решения одной и той же задачи, с чем все присутствующие с блеском справились.
А benchmark - это так, побочный эффект, но тоже полезный.
P.S.
Default/Defunct - я уже в вас путаюсь, не к добру это:)
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.016 c