Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

переменная string. Поменять местами некоторые данные [D6, Win2k]


Страницы:   1 2 3

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;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо