DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: hxh57738897
今日帖子: 33
在线用户: 16
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 lwcvod (lwcvod) ★☆☆☆☆ -
普通会员
2017/7/10 15:40:04
标题:
DateTimeToStr 这个函数有没的优化 浏览:2409
加入我的收藏
楼主: 这个循环需要200来毫秒,感觉太费事了
当然我真实数据超过5W
此帖子包含附件:
JPEG 图像
大小:22.6K
----------------------------------------------
Delphi
作者:
男 zhahongyi (如风) ★☆☆☆☆ -
普通会员
2017/7/10 20:42:58
1楼: 放在循环外面。优化的再好也抵不过你执行好几万次。
----------------------------------------------
-
作者:
男 mousesoft (MouseSoft) ★☆☆☆☆ -
盒子活跃会员
2017/7/10 22:32:20
2楼: 其实现在写程序,要懂得分片,没必要追求串行的速度;很多时候都可以通过异步,并行计算之类的方式的;像JS的Promise之类的封装就很好;
----------------------------------------------
-
作者:
男 hujiacheng ( 旺财) ★☆☆☆☆ -
普通会员
2017/7/10 23:01:04
3楼: 按此在新窗口浏览图片  我想知道 这个str被NEW 多少次。(没看汇编)!
此帖子包含附件:
PNG 图像
大小:2,373B
----------------------------------------------
免费的FTPhttps://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019>http://delphi-z.ruhttps://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019>http://delphi.icm.edu.pl/ftp/https://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019>http://delphi-z.ruhttps://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019
作者:
男 luckyso999 (luckyso) ★☆☆☆☆ -
盒子活跃会员
2017/7/11 0:17:13
4楼: 是不是和电脑也有关系,我的是e3-1230,内存16G
此帖子包含附件:
PNG 图像
大小:50.1K
----------------------------------------------
-
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2017/7/11 8:08:50
5楼: 看不懂,有什么必要的理由去这样搞这个吗?
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 zyhh (zyhh) ▲▲▲▲▲ -
普通会员
2017/7/11 8:30:25
6楼: 是不是考虑自己的环境问题
此帖子包含附件:
PNG 图像
大小:12.0K
----------------------------------------------
-
作者:
男 jczxdai (草籽) ▲▲▲▲△ -
普通会员
2017/7/11 8:44:32
7楼: 51
此帖子包含附件:
PNG 图像
大小:17.6K
----------------------------------------------
草籽天涯
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/7/11 8:47:53
8楼: 其实楼主这种需求就不应该这样写代码。
建议楼主参考 EHLIB CXGRID 显示 格式化日期时间 的 逻辑代码。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 lwcvod (lwcvod) ★☆☆☆☆ -
普通会员
2017/7/11 9:59:47
9楼: 莫非我的机器好淘汰了,为什么你们都50来毫秒就行了
----------------------------------------------
Delphi
作者:
男 zyp1984 (小李他妈的飞刀) ★☆☆☆☆ -
普通会员
2017/7/11 10:58:38
10楼: 80-100之间
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
作者:
男 zyp1984 (小李他妈的飞刀) ★☆☆☆☆ -
普通会员
2017/7/11 11:00:17
11楼: 64位下要更快点。我可以到70。32位就在80-100之间
----------------------------------------------
山外青山楼外楼,能人背后有能人弄..
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/7/11 11:32:14
12楼: 有用的话,不听。
你计算机再强,也不一定能解决问题。
也许今天你是 5万,明天是50万。
正确的解决办法,是 大多数计算机无论是 50 条还是 50万条,都正常的处理。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2017/7/11 21:38:21
13楼: 64ms 楼主该换新电脑了,估计有10年了吧。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2017/7/12 9:10:06
14楼: 我的电脑处理器是五年前的Corei5-3470,环境是Win10+D10.2
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2017/7/13 3:27:57
15楼: 我去...用线程嵌套,试试...
  TThread.Synchronize(nil, procedure
  begin
       s:=DateTimeToStr(now);
  end);
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 advwang (advwang) ★☆☆☆☆ -
普通会员
2017/7/13 11:16:49
16楼: Delphi自带的DateTimeToStr处理了太多的格式的东西,所以慢点是正常的。如果想优化,一个思路就是只处理固定的时间格式。

不截图了,麻烦,这是Delphi自带的DateTimeToStr和我系统自己用的测试比较,50000次,单位毫秒

DateTimeToStr=55.21229
FastDateTimeToStr=9.531661
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2017/7/13 13:52:57
17楼: 你要真是在乎DateTimeToStr的速度,那就自己针对自己的情况写一个新的函数.
通用函数的效率永远比不上专用函数,专用函数的适用性比不上通用函数与
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 bamboocaep (bamboocaep) ★☆☆☆☆ -
普通会员
2017/7/13 14:57:59
18楼: DecodeDate
DecodeTime
剩下的就是拼装字符串了。
比DateTimeToStr快几倍没问题。
----------------------------------------------
-
作者:
男 songhy (songhy) ★☆☆☆☆ -
盒子活跃会员
2017/7/13 16:54:22
19楼: 这个语句,除了测试性能外似乎没有多大的意义啊?
----------------------------------------------
-
作者:
男 advwang (advwang) ★☆☆☆☆ -
普通会员
2017/7/13 21:28:39
20楼: 比如一个场景,对效率要求很高的环境下还要记录日志。那么一个DateTimeToStr就值得优化了。甚至Now,DecodeDate,DecodeTime这些函数都需要优化。比如Now

Now=159.99222
FastNow=16.47408

有意义没意义看自己做什么的。天天纠结在堆UI,堆label,跨平台的,传个数据就用Json的,这些优化对他们就没啥意义了。
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2017/7/14 0:40:05
21楼: DateTimeToStr要读取Windows的系统日期格式设定, 转换出来的字符串格式有可能在不同的电脑上就会不一样, 根据系统的设定甚至有可能会包含完整的英语单词在里头

所以如果不是为了支持不同语言不同国家的本地显示风格, 不要用这个函数
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/7/14 9:14:01
22楼: 顶 20 和 21 楼。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 bamboocaep (bamboocaep) ★☆☆☆☆ -
普通会员
2017/7/14 13:15:38
23楼: 500000次FormatDateTime('yyyy.mm.dd hh:nn:ss zzz', Now):1392ms
500000次MyFastFormatDateTime('yyyy.mm.dd hh:nn:ss zzz', Now):132ms
其中500000次调用Now占用97ms
5年前买的笔记本用虚拟机测试的。
----------------------------------------------
-
作者:
男 machcat (机器猫) ★☆☆☆☆ -
盒子活跃会员
2017/7/14 13:33:29
24楼: to bamboocaep:能共享一下您的函数代码吗
----------------------------------------------
机器猫
作者:
男 bamboocaep (bamboocaep) ★☆☆☆☆ -
普通会员
2017/7/14 13:37:59
25楼: to  machcat (机器猫)

把时间用Trunc(datetime * 24 * 3600 * 1000)变为Int64就是精确到毫秒的时间戳,然后跟上一次的时间戳对比,相同就直接返回上次的结果。

如果格式固定的话还可以单独针对特定的格式做优化。
----------------------------------------------
-
作者:
男 lwcvod (lwcvod) ★☆☆☆☆ -
普通会员
2017/7/14 16:56:59
26楼: 大牛们,能丢点代码出来不
----------------------------------------------
Delphi
作者:
男 mefuleu (阿奇) ★☆☆☆☆ -
普通会员
2017/7/15 14:27:16
27楼: function sprintf(S: PAnsiChar; const Format: PAnsiChar): Integer;cdecl; varargs; external 'msvcrt.dll';
function FastFormatTime(dt:TDateTime):string;
var
   second :Int64;
   y,m,d,h,n,s,ms:Word;
begin
   SetLength(Result, 255);
   DecodeDateTime(dt,y,m,d,h,n,s,ms);
   sprintf(PChar(Result),'%04d-%02d-%02d %02d:%02d:%02d.%03d',y,m,d,h,n,s,ms);
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  i:Integer;
  str:string;
  t:int64;
begin
  t:= timeGetTime;
  for i:=1 to 50000 do
  begin
    str :=FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz',Now);
  end;
  mmo1.Lines.Add('FormatDateTime耗时:' + IntToStr(timeGetTime-t) + ' ' + str); //>100 ms

  t:= timeGetTime;
  for i:=1 to 50000 do
  begin
    str :=FastFormatTime(Now);
  end;
  mmo1.Lines.Add('FormatDateTime耗时:' + IntToStr(timeGetTime-t) + ' ' + str); //<40ms

end;
----------------------------------------------
-
作者:
男 lwcvod (lwcvod) ★☆☆☆☆ -
普通会员
2017/7/15 21:29:20
28楼:  function FastFormatTime(dt:TDateTime):string;
var
   second :Int64;
   y,m,d,h,n,s,ms:Word;
begin
   SetLength(Result, 255);
   DecodeDateTime(dt,y,m,d,h,n,s,ms);
   sprintf(PChar(Result),'%04d-%02d-%02d %02d:%02d:%02d.%03d',y,m,d,h,n,s,ms);
end;

procedure TForm1.Button2Click(Sender: TObject);

begin
 ShowMessage(FastFormatTime(Now));
end;


不知道什么地方错误,显示出来的是乱码
----------------------------------------------
Delphi
作者:
男 like1101 (along) ▲▲▲▲△ -
普通会员
2017/7/15 22:52:51
29楼: function FastFormatTime(dt:TDateTime):string;
返回值类型变为ansistring
function FastFormatTime(dt:TDateTime):ansistring;
----------------------------------------------
-
作者:
男 advwang (advwang) ★☆☆☆☆ -
普通会员
2017/7/16 22:28:56
30楼: 不推荐使用VC的sprintf,效率比Delphi的Format低N倍
Format=162
sprintf=2430
----------------------------------------------
-
作者:
男 err0rc0de (code) ▲▲▲▲△ -
普通会员
2017/7/16 23:54:37
31楼:
type
  PDType = ^TDType;
  TDType = packed record
    yy: array [0..3] of Char;
    s1: Char;
    mm: array [0..1] of Char;
    s2: Char;
    dd: array [0..1] of Char;
    space: Char;
    hh: array [0..1] of Char;
    s3: Char;
    nn: array [0..1] of Char;
    s4: Char;
    ss: array [0..1] of Char;
    s5: Char;
    ms: array [0..2] of Char;
  end;

const
  SDateTimeFormatLength = sizeof(TDType);
  SNumbers: array [0..9] of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');

procedure FastFormatTime(si: TSystemTime; var result: string); overload;

  procedure ToYear(year: Integer; dest: PChar);
  var
    r: Integer;
  begin
    dest^ := SNumbers[year div 1000];
    r := year mod 1000;
    (dest + 1)^ := SNumbers[r div 100];
    r := r mod 100;
    (dest + 2)^ := SNumbers[r div 10];
    (dest + 3)^ := SNumbers[r mod 10];
  end;

  procedure ToWord(Value: Word; Dest: PChar);
  begin
    dest^ := SNumbers[Value div 10];
    (dest + 1)^ := SNumbers[Value mod 10];
  end;   

  procedure ToMillisSeconds(Value: Word; Dest: PChar);
  var
    r: Integer;
  begin
    dest^ := SNumbers[Value div 100];
    r := Value mod 100;
    (dest + 1)^ := SNumbers[r div 10];
    (dest + 2)^ := SNumbers[r mod 10];
  end;

var
  len: Integer;
  p: PDType;
begin
  len := Length(Result);
  if len < SDateTimeFormatLength then
    SetLength(Result, SDateTimeFormatLength);
  p := PDType(result);
  p.s1 := '-';
  p.s2 := '-';
  p.space := ' ';
  p.s3 := ':';
  p.s4 := ':';
  p.s5 := '.';

  ToYear(si.wYear, p.yy);
  ToWord(si.wMonth, p.mm);
  ToWord(si.wDay, p.dd);
  ToWord(si.wHour, p.hh);
  ToWord(si.wMinute, p.nn);
  ToWord(si.wSecond, p.ss);
  ToMillisSeconds(si.wMilliseconds, p.ms);
end;

function FastFormatTime(dt: TDateTime): string; overload;
var
  si: TSystemTime;
begin
  DateTimeToSystemTime(dt, si);
  FastFormatTime(si, result);
end;
----------------------------------------------
-
作者:
男 mefuleu (阿奇) ★☆☆☆☆ -
普通会员
2017/7/17 11:07:05
32楼: 特意到xe10.2实验了一下代码,耗时约50ms,楼上到代码时间稍微少一点点。
此帖子包含附件:
PNG 图像
大小:56.7K
----------------------------------------------
-
作者:
男 machcat (机器猫) ★☆☆☆☆ -
盒子活跃会员
2017/7/17 13:36:25
33楼: 好!希望继续帖出超强代码
----------------------------------------------
机器猫
作者:
男 hujiacheng ( 旺财) ★☆☆☆☆ -
普通会员
2017/7/17 16:03:43
34楼: #to 32 从外部 分配好内存 才是最好的吧  你这样进一次这个函数分配一次。。。
----------------------------------------------
免费的FTPhttps://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019>http://delphi-z.ruhttps://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019>http://delphi.icm.edu.pl/ftp/https://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019>http://delphi-z.ruhttps://download-installer.cdn.mozilla.net/pub/firefox/releases/43.0/win64/zh-CN/https://cc.embarcadero.com/Author/575019
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2017/7/18 9:08:13
35楼: 31楼的最快,不过64位有问题。
此帖子包含附件:
PNG 图像
大小:16.1K
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行203.125毫秒 RSS