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

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

Как перевести дату в нормальный формат? [D7, XP]


Страницы:   1 2

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-названий трех месяцев.


Страницы:   1 2

Наверх

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