Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];
Внизпеременная string. Поменять местами некоторые данные Найти похожие ветки
← →
Phoenix9000 © (2005-05-20 15:11) [0]Доброго времени суток.
Есть переменная date типа string.
В нее идет запись даты с помощью Datetostr() например:
25.12.1980
нужно сделаь так, чтобы в переменной date2 тоже типа string эта дата была записана как :
12.25.1980
Заранее спасибо за ответ
← →
Ega23 © (2005-05-20 15:14) [1]FormatDateTime + F1
← →
Marser © (2005-05-20 15:17) [2]
var d:TDateTime;
begin
d:=StrToDate("25.12.1980");
caption:=formatdatetime("mm.dd.yyyy",d);
← →
Jeer © (2005-05-20 15:21) [3]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] := "."
← →
Alexander Panov © (2005-05-20 15:23) [4]
> Phoenix9000 © (20.05.05 15:11)
> Доброго времени суток.
>
> Есть переменная date типа string.
Не надо использовать идентификаторы переменных, которые аналогичны названиям функций.
← →
default © (2005-05-20 15:32) [5]Jeer © (20.05.05 15:21) [3]
забавно:)
Вы бы в своём коде стали так писать или же ф-ции использовать?
← →
evvcom © (2005-05-20 15:33) [6]
> Jeer © (20.05.05 15:21) [3]
var w: Word;
begin
w := PWORD(@s[1])^;
PWORD(@s[1])^ := PWORD(@s[4])^;
PWORD(@s[4])^ := w;
end;
← →
default © (2005-05-20 15:35) [7]evvcom © (20.05.05 15:33) [6]
тут интерес то весь был в точках(без дополнительных переменных):) мы ведь знаем что они там всегда есть и стирая при перестановке не теряем никакой информации
← →
evvcom © (2005-05-20 15:43) [8]
> default © (20.05.05 15:35) [7]
Я это понял, но тем не менее начиная с этого поста (Jeer © (20.05.05 15:21) [3]) можно смело ставить смайлики. Хотя новичка, не знающего [1], должно заинтересовать и [3], и [6], и есть еще варианты, и все они работают.
← →
Jeer © (2005-05-20 15:47) [9]default © (20.05.05 15:32) [5]
Jeer © (20.05.05 15:21) [3]
47 ns
Marser © (20.05.05 15:17) [2]
3105 ns
← →
Jeer © (2005-05-20 15:50) [10]evvcom © (20.05.05 15:33) [6]
25 ns !!!
← →
VVV-First (2005-05-20 16:04) [11]В нее идет запись даты с помощью Datetostr() например:
25.12.1980
а что не прощебудет сразу записать в стрин , так как тебе надо
var
t:TDateTime;
begin
s := FormatDateTime("mm.dd.yyyy",T);
end;
← →
evvcom © (2005-05-20 16:05) [12]Ну, Marser © (20.05.05 15:17) [2] 3105 ns - это не корректно, это был чистый пример использования FormatDateTime, который должен делаться вместо DateToStr. Поэтому сравнивать на скорость этот пример просто неделикатно.
← →
default © (2005-05-20 16:11) [13]
procedure TForm1.Button1Click(Sender: TObject);
var
w: Word;
s1: String;
s2: PChar;
begin
s1 := "25.12.1980";
s2 := PChar(s1);
w := PWord(@s2[0])^;
PWord(@s2[0])^ := PWord(@s2[3])^;
PWord(@s2[3])^ := w;
Caption := s1
// PChar для того чтобы избежать внутренних вызовов уникальности строки
// при работе с типом String
end;
Jeer © (20.05.05 15:50) [10]
а так сколько будет?
← →
evvcom © (2005-05-20 16:15) [14]
> // PChar для того чтобы избежать внутренних вызовов уникальности
> строки
> // при работе с типом String
в [6] итак нет никаких "внутренних вызовов уникальности строки"
← →
Jeer © (2005-05-20 16:19) [15]Не знаю, поскольку вылетает:)
← →
Jeer © (2005-05-20 16:21) [16]evvcom © (20.05.05 16:05) [12]
Ну почему, сравнивать можно и нужно.
Применяемость зависит от ситуации и нужно знать варианты, методологические.
← →
default © (2005-05-20 16:23) [17]evvcom © (20.05.05 16:15) [14]
в CPU если посмотреть на код
procedure TForm1.Button1Click(Sender: TObject);
var
w: Word;
s: String;
begin
s := "25.12.1980";
w := PWORD(@s[1])^;
PWORD(@s[1])^ := PWORD(@s[4])^;
PWORD(@s[4])^ := w;
Caption := s
end;
то там видны вызововы UniqueStringA, к тому же они прилично длины по сравнению с реально требующимся кодом
← →
default © (2005-05-20 16:31) [18]Jeer © (20.05.05 16:19) [15]
var
Form1: TForm1;
s1: String;
s2: PChar;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
w: Word;
begin
s1 := "25.12.1980";
s2 := PChar(s1);
w := PWord(@s2[0])^;
PWord(@s2[0])^ := PWord(@s2[3])^;
PWord(@s2[3])^ := w;
//// s2[4] := "7";
// Caption := s2[2];
Caption := s1
// PChar для того чтобы избежать внутренних вызовов уникальности строки
// при работе с типом String
end;
← →
default © (2005-05-20 16:31) [19]Jeer © (20.05.05 16:19) [15]
var
Form1: TForm1;
s1: String;
s2: PChar;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
w: Word;
begin
s1 := "25.12.1980";
s2 := PChar(s1);
w := PWord(@s2[0])^;
PWord(@s2[0])^ := PWord(@s2[3])^;
PWord(@s2[3])^ := w;
Caption := s1
end;
← →
evvcom © (2005-05-20 16:35) [20]
> то там видны вызововы UniqueStringA
у меня сейчас нет дельфей под руками, но что-то меня терзают смутные сомнения по поводу [17]... Приеду домой попробую. А если не влом, то можно сюда выложить увиденное?
← →
Jeer © (2005-05-20 16:46) [21]PWord(@s2[0])^ := PWord(@s2[3])^;
Слетает на D5.
← →
Sha © (2005-05-20 16:53) [22]Привет участникам соревнований!
procedure TForm1.Button4Click(Sender: TObject);
var
s: string;
p, q: pchar;
w: word;
begin;
s:="25.12.1980";
UniqueString(s);
p:=pointer(s); q:=p+3;
w:=pword(p)^; pword(p)^:=pword(q)^; pword(q)^:=w;
Caption:=s;
end;
← →
default © (2005-05-20 17:10) [23]Jeer © (20.05.05 16:46) [21]
а на D6 нет
так и пришлось Sha вызвать UniqueString(s); чтобы потом преспокойно менять строку...
← →
default © (2005-05-20 17:12) [24]evvcom © (20.05.05 16:35) [20]
пробовал принтскрин+распечатка+сканирование+распознание, но распозналось криво, быстрее было бы руками набить...
← →
default © (2005-05-20 17:14) [25]к [24]
криво не из-за распечатывания(так пришлось...), а то что сдвинуто всё вышло
← →
Sha © (2005-05-20 17:14) [26]> default © (20.05.05 17:10) [23]
Если мы уверены, что строка уникальна, то вызывать не требуется.
Собственно сам обмен требует 6 машинных команд.
← →
default © (2005-05-20 17:20) [27]Sha © (20.05.05 17:14) [26]
почему код [19] работает на D6, а на D5 не работает?
← →
default © (2005-05-20 17:23) [28]Sha © (20.05.05 17:14) [26]
"Если мы уверены, что строка уникальна, то вызывать не требуется."
НЕТ!
код [13] вообще не работает(кроме как в режиме отладки)
поставив UniqueString(s1); всё заработало
так что эта штука имеет вес и когда нет дублей...
← →
Jeer © (2005-05-20 17:24) [29]Sha © (20.05.05 16:53) [22]
9 ns
На грани чувствительности:)
А может и за гранью.
← →
default © (2005-05-20 17:28) [30]Jeer © (20.05.05 17:24) [29]
моя идея!:)
если писать
procedure TForm1.Button1Click(Sender: TObject);
var
w: Word;
s1: String;
s2: PChar;
begin
s1 := "25.12.1980";
UniqueString(s1); s2 := PChar(s1);
w := PWord(@s2[0])^;
PWord(@s2[0])^ := PWord(@s2[3])^;
PWord(@s2[3])^ := w;
Caption := s1
// PChar для того чтобы избежать внутренних вызовов уникальности строки
// при работе с типом String
end;
то работает!
учитывая что нет дублей строки я этот вызов не поставил и ...не заработало
← →
Jeer © (2005-05-20 17:33) [31]default © (20.05.05 17:28) [30]
Твоя - так твоя.
12 ns
← →
Jeer © (2005-05-20 17:42) [32]поправка из-за глюков:
Jeer: 47-49 ns
Sha: 45-46 ns ns
Defunct: 43-44 ns
P-IV 2GHz 1Gb
← →
Sha © (2005-05-20 17:43) [33]> default © (20.05.05 17:20) [27]
почему код [19] работает на D6, а на D5 не работает?
Ну, код [19] - пример того, как делать не надо.
Он и в D6 работать не будет, если все используемые переменные объявить внутри процедуры.
Дело тут в том, что присваививания значений локальным и глобальным строкам в D6 используются разные процедуры.
Локальные просто ссылаются на RO-строку (отсюда AV),
а глобальные копируют ее содержимое (поэтому все работает).
Вызов UniqueString гарантирует нам, что строка не RO.
> default © (20.05.05 17:23) [28]
>> Sha © (20.05.05 17:14) [26]
>> "Если мы уверены, что строка уникальна, то вызывать не требуется."
> НЕТ!
Не спорь, пока не посмотришь в окно CPU :)
← →
Юрий Зотов © (2005-05-20 17:45) [34]> Jeer © (20.05.05 17:24) [29]
Дык... если автор призы от Борланда берет за оптимальный ассемблеровский код - что ж удивляться-то?
:о)
← →
Jeer © (2005-05-20 17:47) [35]Я удивляюсь ?
Наоборот, очень рад, что это наши ребята берут призы.
А об успехах Шарохова знаю, смотрел и не раз его рейтинг.
← →
Игорь Шевченко © (2005-05-20 17:49) [36]Я бы сразу писал в нужном виде через FormatDateTime, или, если исходная строка получается извне, то так, как в [3], потому что оно понятнее программисту :)
← →
Jeer © (2005-05-20 17:52) [37]Игорь Шевченко © (20.05.05 17:49) [36]
Собственно, поэтому и был приведен данный вариант, из методических соображений, как возможность использования незначимого.
Программисту - это понятно, а профи - кто же его поймет:))
← →
Sha © (2005-05-20 17:53) [38]> Jeer © (20.05.05 17:42) [32]
Думаю, измерения не совсем точны.
Для того, чтобы убедиться в этом, попробуй замерить время выполнения пустого оператора ";" :)
Кроме того, вызов UniqueString не должен входить в измеряемый интервал времени, т.к. в реальном приложении строка получается в результате вычислений и, как правило, уникальна и уж точно не является RO-константой.
← →
Jeer © (2005-05-20 18:04) [39]Пустой цикл замерить невозможно (~1 ns)
После выноса UniqueString(s)
Jeer is = 49 ns
Sha is = 44 ns
Defunct is = 45 ns
← →
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.61 MB
Время: 0.015 c