![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перевести дату в нормальный формат? [D7, XP]
turbo © (2012-09-13 07:38:00)Есть дата: Sep 17 15:49:28 2012
Как ее привести к виду: dd.mm.yy hh:nn:ss
Спасибо.
Inovet (2012-09-17 15:11:00) [1]> [32] Jeer © (17.09.12 14:53)
Так понятнее.
Jeer (2012-09-17 14:57:00) [2]// Function "Hash & Case"
function Month2Num_07(const sDate: string): integer;
begin
case byte(sDate[1]) + byte(sDate[2]) + byte(sDate[3]) of
268: Result := 12;
269: Result := 2;
281: Result := 1;
285: Result := 8;
288: Result := 3;
291: Result := 4;
294: Result := 10;
295: Result := 5;
296: Result := 9;
307: Result := 11;
299: Result := 7;
301: Result := 6;
end;
end;
//*** Моделирование разностным уравнением
// Function "Delta"
function Month2Num_08(const sDate: string): integer;
var i: integer;
begin
Result := 0;
for i:= 0 to (byte(sDate[1]) + byte(sDate[2]) + byte(sDate[3]) - 268) do
Result := Result + arZ[i];
end;
arZ[0] := 12;
arZ[1] := -10;
arZ[13] := -1;
arZ[17] := 7;
arZ[20] := -5;
arZ[23] := 1;
arZ[26] := 6;
arZ[27] := -5;
arZ[28] := 4;
arZ[31] := -2;
arZ[33] := -1;
arZ[39] := 5;
Jeer (2012-09-17 14:53:00) [3]Без
if Length(month) <> 3 then
raise Exception.CreateRes(@rsInvalidMonthName);
Function "Tree case": 151 ticks
Function "If ": 452 ticks
Function "Hash ": 54 ticks
Function "IndexOf ": 4458 ticks
Function "Values ": 16026 ticks
Function "Case2 ": 137 ticks
Function "Hash + Case ": 137 ticks
Function "Delta ": 171 ticks
*******
function GetMonthIdx (const month: AnsiString): Integer;
begin
Result := 12;
end;
Несколько запусков по 100 тыщ измерений
Function "IndexOf ": 50 ticks
Function "IndexOf ": 50 ticks
Function "IndexOf ": 52 ticks
Function "IndexOf ": 50 ticks
Function "IndexOf ": 50 ticks
Function "IndexOf ": 54 ticks
Function "IndexOf ": 50 ticks
Function "IndexOf ": 53 ticks
Inovet (2012-09-17 14:01:00) [4]> [30] Jeer © (17.09.12 09:28)
> 1. Function "Tree case" : 139 ticks
...
> 6. Function "Case2 ": 133 ticks
Во как, странно. А без этого сколько будет?
if Length(month) <> 3 then
raise Exception.CreateRes(@rsInvalidMonthName);
А так сколько?
function GetMonthIdx (const month: AnsiString): Integer;
begin
Result := 12;
end;
Jeer (2012-09-17 09:28:00) [5]Битва вариантов GetMonthIdx():
1. Function "Tree case" : 139 ticks
2. Function "If ": 443 ticks
3. Function "Hash ": 53 ticks
4. Function "IndexOf ": 4822 ticks
5. Function "Values ": 16870 ticks
6. Function "Case2 ": 133 ticks
Jeer (2012-09-16 20:24:00) [6]Ну да, примерно так и предполагался следующий вариант.
В понедельник приведу сравнителный цифра.
Leonid Troyanovsky (2012-09-14 20:45:00) [7]
> Jeer © (13.09.12 21:44) [14]
> Будем еще развлекаться :)
function GetMonthIdx (const month: AnsiString): Integer;
resourcestring
rsInvalidMonthName = 'Invalid month name';
begin
if Length(month) <> 3 then
raise Exception.CreateRes(@rsInvalidMonthName);
case PInteger(PChar(month))^ of
$006E614A {Jan} : Result := 01;
$00626546 {Feb} : Result := 02;
$0072614D {Mar} : Result := 03;
$00727041 {Apr} : Result := 04;
$0079614D {May} : Result := 05;
$006E754A {Jun} : Result := 06;
$006C754A {Jul} : Result := 07;
$00677541 {Aug} : Result := 08;
$00706553 {Sep} : Result := 09;
$0074634F {Oct} : Result := 10;
$00766F4E {Nov} : Result := 11;
$00636544 {Dec} : Result := 12;
else
raise Exception.CreateRes(@rsInvalidMonthName);
end;
end;
--
Regards, LVT.
Jeer (2012-09-14 12:02:00) [8]Тут вопрос к типу процессора.
Jeer (2012-09-14 12:01:00) [9]Ну это понятно, но при random выборке большого объема получаем статистически значимый результат, причем повторимый от теста к тесту.
Anatoly Podgoretsky (2012-09-14 11:32:00) [10]> Jeer (14.09.2012 10:36:20) [20]
Данный код выполняется разное время, в зависимости от данных
Jeer (2012-09-14 10:46:00) [11]Стало так:)
F1 ( case ): 143 ticks
F2 (if): 450
F3 (hash): 54
F4 (.indexOf): 4500
F5 (.Values): 16000
Jeer (2012-09-14 10:44:00) [12]
> можно заметно сэкономить, если передавать параметр с const.
Согласен, хотя тут просто иллюстрация вариантов, а не погоня за абсолютными цифрами.
Jeer (2012-09-14 10:41:00) [13]Уточнее, как в реальности:
function Month2Num_03(sDate: string): integer;
begin
Result := arCnv[ord(sDate[1]) + ord(sDate[2]) + ord(sDate[3]) - 268];
end;
Таблица замены индекса на номер месяца:
arCnv[0..39]
Заполнены 12 позиций
RWolf (2012-09-14 10:41:00) [14]можно заметно сэкономить, если передавать параметр с const.
Jeer (2012-09-14 10:36:00) [15]Наврал, а точнее - попутал:
F1 ( case ): 830 vs 288 ticks
F2 ( if ): 470 vs 590 ticks
//***
function Month2Num_01(sDate: string): integer;
begin
case sDate[1] of
'J': case sDate[2] of
'a': Result := 1;
'u': case sDate[3] of
'n': Result := 6;
'l': Result := 7;
end;
end;
'F': Result := 2;
'M': case sDate[3] of
'r': Result := 3;
'y': Result := 5;
end;
'A': case sDate[3] of
'r': Result := 4;
'g': Result := 8;
end;
'S': Result := 9;
'O': Result := 10;
'N': Result := 11;
'D': Result := 12;
else
Result := -1;
end;
end;
RWolf (2012-09-14 10:08:00) [16]> Jeer © (14.09.12 09:54) [18]
спекулятивное выполнение играет, вероятно;
впрочем, не предъявлен код с case'ом.
Jeer (2012-09-14 09:54:00) [17]Вот так так..
P-IV 1.8 GHz 32х против iP5-2400 3.1 GHz 64x
F1 ( if ): 830 vs 288 ticks
F2 (case): 470 vs 590
F3 (hash): 420 vs 200
F4 (.indexOf): 5000 vs 4600
F5 (.Values): 28000 vs 16000
if-ы разбираются намного лучше?
case-ы хуже ???
Jeer (2012-09-13 23:09:00) [18]5. Функция на основе TStringList.Values[..]
Time: ~28000 ticks
Еще больший жуть.
Jeer (2012-09-13 22:58:00) [19]4. Функция на основе TStringlist.IndexOf(..)
Time: ~15300 ticks
Жуть.
Jeer (2012-09-13 22:01:00) [20]P.S.
Функция на основе хеш - особо компактна :)
function Month2Num_03(sDate: string): integer;
begin
Result := arCnv[ord(sDate[1]) + ord(sDate[2]) + ord(sDate[3])];
end;
P.P.S.
Основано на том, что сумма трех ord(символов) - уникальна в пределах short-названий трех месяцев.