程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi高效定制格式的FormatDateTime

Delphi高效定制格式的FormatDateTime

編輯:Delphi

本人根據殲10博主的此博文的思路進行改進,目的是高效的實現FormatDateTime('YYYY-MM-DD HH:NN:SS.ZZZ', Now);

在DelphiXE3環境測試10,000,000次,

Delphi自帶的FormatDateTime  = 20405 ms

殲10的優化函數  = 2683 ms

本文優化函數 = 1903 ms

在DelphiXE3 環境測試10,000,000次,

Delphi自帶的FormatDateTime  = 18782 ms

殲10的優化函數  = 2091 ms

本文優化函數 = 1357 ms

 

type
  UInt32 = LongWord;
  UInt32Array = array[0..0] of UInt32;
  PUInt32Array = ^UInt32Array;  
  PUInt32 = ^UInt32;
  PUInt64 = ^UInt64;
  UInt64Array = array[0..0] of UInt64;
  PUInt64Array = ^UInt64Array;
procedure sfNowToBuf5(const OutBuf: PWideChar; BufSize: Integer);
const
  strPatternHandred: Widestring =
    '00010203040506070809101112131415161718192021222324252627282930' +
    '313233343536373839404142434445464748495051525354555657585960' +
    '6162636465666768697071727374757677787980' +
    '81828384858687888990919293949596979899';
  strPattern10: Widestring = '0'#0'1'#0'2'#0'3'#0'4'#0'5'#0'6'#0'7'#0'8'#0'9'#0;
  strPatternYear: Widestring =
    '201420152016201720182019202020212022202320242025202620272028202920302031' +
    '2032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056' +
    '2057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081' +
    '2082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106';
  strPatternMonth: WideString =
    '-00--01--02--03--04--05--06--07--08--09--10--11--12-';
  strPatternHour: WideString =
    ' 00: 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: ' +
    '16: 17: 18: 19: 20: 21: 22: 23:';
  strPatternSecond: WideString =
    ':00.:01.:02.:03.:04.:05.:06.:07.:08.:09.:10.:11.:12.:13.:14.:15.:' +
    '16.:17.:18.:19.:20.:21.:22.:23.:24.:25.:26.:27.:28.:29.:30.:31.:32.:33.:34.:35.:36.:37.:38.:' +
    '39.:40.:41.:42.:43.:44.:45.:46.:47.:48.:49.:50.:51.:52.:53.:54.:55.:56.:57.:58.:59.';

var
  Year, Month, Day, HH, MM, SS, ZZZ: WORD;
  Q: PWideChar;
  P: PUInt32;
  strHandred: PUInt32Array;
  strYear, strMonth, strHour, strSecond: PUInt64Array;
  str10: PUInt32Array;
  I, J: Integer;
  SystemTime: TSystemTime;
  lvBuf: array[0..23] of Widechar;
begin
  if BufSize <= 0 then
    Exit;
  strHandred := PUInt32Array(PWideChar(strPatternHandred));
  str10 := PUInt32Array(PWideChar(strPattern10));
  strYear := PUInt64Array(PWideChar(strPatternYear));
  strMonth := PUInt64Array(PWideChar(strPatternMonth));
  strHour := PUInt64Array(PWideChar(strPatternHour));
  strSecond := PUInt64Array(PWideChar(strPatternSecond));
  P := @lvBuf[0]; // OutBuff;
  FillChar(lvBuf, sizeof(lvBuf), 0);

  GetLocalTime(SystemTime);
  Year := SystemTime.wYear - 2014;
  Month := SystemTime.wMonth;
  Day := SystemTime.wDay;
  HH := SystemTime.wHour;
  MM := SystemTime.wMinute;
  SS := SystemTime.wSecond;
  ZZZ := SystemTime.wMilliseconds;

   //Year
  PUInt64(P)^ := strYear[Year];  Inc(PUInt64(P));

  //Month
  PUInt64(P)^ := strMonth[Month];  Inc(PUInt64(P));

  //Day
  P^ := strHandred[Day];  Inc(P);

  //HH
  PUInt64(P)^ := strHour[HH];  Inc(PUInt64(P));

  //MM
  P^ := strHandred[MM];  Inc(P);

  //SS
  PUInt64(P)^ := strSecond[SS];  Inc(PUInt64(P));

  //ZZZ
  I := (ZZZ div 10);
  P^ := strHandred[I];  Inc(P);
  I := (ZZZ mod 10);
  P^ := str10[I];

  if BufSize > 23 then BufSize := 23;
  Q := OutBuf;
  for I := 0 to BufSize - 1 do
    Q[I] := lvBuf[I]
end;

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved