![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
переменная string. Поменять местами некоторые данные [D6, Win2k]
Phoenix9000 © (2005-05-20 15:11:00)Доброго времени суток.
Есть переменная date типа string.
В нее идет запись даты с помощью Datetostr() например:
25.12.1980
нужно сделаь так, чтобы в переменной date2 тоже типа string эта дата была записана как :
12.25.1980
Заранее спасибо за ответ
Jeer (2005-05-23 10:36:00) [1]К сожалению, в пятницу, при проверке вышеприведенных методов система пребывала, как оказалось, в странном состоянии.
Собственно, это было видно по цифрам - явно разные по количеству тактов тесты стали давать примерно одинаковый результат.
(хотя для 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 - я уже в вас путаюсь, не к добру это:)
Defunct (2005-05-21 01:20:00) [2]> Jeer
Я, к сожалению, в этой ветке не участвовал ;>
Все лавры господину default'у!
PS: спасибо, что обо мне вспомнили, :)
evvcom (2005-05-20 22:36:00) [3]Добрался до машины с Delphi... посмотрел CPU. Да... Век живи, век учись.
default (2005-05-20 19:05:00) [4]Sha © (20.05.05 19:02) [55]
угу
это разделение нелогичное, конечно, впечатлило...
Sha (2005-05-20 19:02:00) [5]> RO-константы расшифруйте(
Строки, которые при загрузке экзешника, размещаются на странице
памяти с доступом только на чтение.
Всегда имеют счетчик ссылок, установленный в -1.
default (2005-05-20 19:00:00) [6]вообщем всё понял
default (2005-05-20 18:56:00) [7]RO я понимал как Read Only(RefCount>1)
сначала подумал что RO это ReferenceOne:)
"Ну ты понимаешь, конечно, что тем самым ты меняешь значения 3-х строк, а не одной? :)"
да, конечно
RO-константы расшифруйте(
default (2005-05-20 18:53:00) [8]+[50]
"кстати если локальной строке присвоить константу, то её счётчик ссылок равен $FFFFFFFF и AV в результате
если же попытатьcя изменить нелегеально значение строки, к примеру, со счётчиком ссылок 3, то нет никакого AV-а"
вот это кажется понял - в первом случае AV из-за изменения константы, во втором это уже не константа хоть и строка RO
первый вопрос остаётся?
почему глобальная переменная сразу готова к изменению, для локальной же обязательно избавляться от RO?
Sha (2005-05-20 18:51:00) [9]> default © (20.05.05 18:44) [49]
> "Локальные просто ссылаются на RO-строку (отсюда AV)"
> "а глобальные копируют ее содержимое (поэтому все работает)."
> зачем такое разделение?
Думаю, для совмести со старыми версиями.
> кстати если локальной строке присвоить константу, то её
> счётчик ссылок равен $FFFFFFFF и AV в результате
Ну, так я тебе сказал то же самое: RO-константы имеют счетчик ссылок -1.
> если же попытатьcя изменить нелегеально значение строки,
> к примеру, со счётчиком ссылок 3, то нет никакого AV-а
Ну ты понимаешь, конечно, что тем самым ты меняешь значения 3-х строк, а не одной? :)
default (2005-05-20 18:45:00) [10]Sha © (20.05.05 17:43) [33]
"Локальные просто ссылаются на RO-строку (отсюда AV)"
"а глобальные копируют ее содержимое (поэтому все работает)."
зачем такое разделение?
кстати если локальной строке присвоить константу, то её счётчик ссылок равен $FFFFFFFF и AV в результате
если же попытатьcя изменить нелегеально значение строки, к примеру, со счётчиком ссылок 3, то нет никакого AV-а
:(
default (2005-05-20 18:44:00) [11]Sha © (20.05.05 17:43) [33]
"Локальные просто ссылаются на RO-строку (отсюда AV)"
"а глобальные копируют ее содержимое (поэтому все работает)."
зачем такое разделение?
кстати если локальной строке присвоить константу, то её счётчик ссылок равен $FFFFFFFF и AV в результате
если же попытатьcя изменить нелегеально значение строки, к примеру, со счётчиком ссылок 3, то нет никакого AV-а
:(
Sha (2005-05-20 18:26:00) [12]Ну так ты меришь накладные расходы на организацию выполнения цикла :)
А время пустого оператора получилось равным нулю из-за оптимизатора, который выбросил цикл нафиг.
Попробуй своим способом измерить время работы оператора nop (0.5 такта CPU):
asm nop; end;
Jeer (2005-05-20 18:19:00) [13]Так это выглядит:)
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:18:00) [14]> Jeer © (20.05.05 18:17) [45]
Код приведи.
Jeer (2005-05-20 18:17:00) [15]QueryPerformanceCounter;
Допускаю, конечно, наличие систематического сдвига.
Jeer (2005-05-20 18:13:00) [16]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] := '.';
Sha (2005-05-20 18:12:00) [17]Ты чем таким меришь, что у тебя такая дискретность?
Sha (2005-05-20 18:11:00) [18]> Jeer © (20.05.05 18:04) [39]
44 нс на 2ГГц пентиуме - это 88 тактов CPU.
Не могут6 мувов в цикле исполняться такое время.
Jeer (2005-05-20 18:11:00) [19]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;
Jeer (2005-05-20 18:08:00) [20]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;