Delphi 匿名函数的几个实际应用(二)

摘要:
比较两个代码片段及其执行毫秒数。您可以编写以下内容:[delphi]viewplaincopyprocessTFormAnonTiming btnClassicClick;varstr1:字符串;str2:AnsiString;一: 整数;t1:TDateTime;beginst1:='MarcoCantù';t1:=现在;对于I:=1toMaxLoop2destr1:=AnsiUpperCase;t1:=now-t1;备忘录1行。添加str2:=“MarcoCantù”;t1:=现在;对于I:=1toMaxLoop2destr2:=AnsiUpperCase;t1:=now-t1;备忘录1行。添加终止为了避免重复计时代码,您可以编写一个调用计时函数,并通过不带参数的匿名方法调用代码片段:[delphi]viewplaincopyfunctionTimeCode:string;vart1:TDateTime;一: 整数;begint1:=现在;forI:=1tonLoopsdoproc;t1:=now-t1;结果:=FormatDateTime;终止程序TFormAnonTiming。btnAnonClick;varstr1:字符串;str2:AnsiString;beginst1:='MarcoCantù';备忘录1行。添加str2:=“MarcoCantù”;备忘录1行。添加终止在下面的示例中,可以使用GetTickCount而不是Now函数找到更轻量级的版本。执行标准版本和依赖匿名方法的版本将获得以下结果:ClassicAnsiUpperCase:00:00.588AnsiUpper Case:0:0.01.08AnonymousAnsiUpPerCase:0:0.00.644AnsiUppersCase:0:00.01153如您所见,匿名方法版本的差异为8%。因为本地代码是直接执行的,所以程序使用虚拟方法来调用匿名函数。

Timing Anonymous Methods 计时功能匿名函数  

开发者们经常需要添加计时代码到一个已有的常规过程中,比较他们的相关速度。前面例子已经使用了几次实例,指出Uncode字符执行速度。对比两个代码片段,比较他们的执行毫秒数,妳可以写出下面内容(在本书第二章的“转换字符”例子):

 

  1. procedure TFormAnonTiming.btnClassicClick(  
  2. Sender: TObject);  
  3. var  
  4. str1: string 
  5. str2: AnsiString;  
  6. I: Integer;  
  7. t1: TDateTime;  
  8. begin  
  9. str1 := 'Marco Cantù' 
  10. t1 := Now;  
  11. for := 1 to MaxLoop2 do  
  12. str1 := AnsiUpperCase (str1);  
  13. t1 := now t1;  
  14. Memo1.Lines.Add ('AnsiUpperCase (string): '  
  15. FormatDateTime('nn:ss.zzz't1));  
  16. str2 := 'Marco Cantù' 
  17. t1 := Now;  
  18. for := 1 to MaxLoop2 do  
  19. str2 := AnsiUpperCase (str2);  
  20. t1 := now t1;  
  21. Memo1.Lines.Add ('AnsiUpperCase (AnsiString): '  
  22. FormatDateTime('nn:ss.zzz't1));  
  23. end 

 

为了避免多次重复计时代码,妳可以写一个调用计时函数,通过无参方式的匿名方法调用代码片段:

 

  1. function TimeCode (nLoops: Integer; proc: TProc): string 
  2. var  
  3.   t1: TDateTime;  
  4.   I: Integer;  
  5. begin  
  6.   t1 := Now;  
  7.   for := 1 to nLoops do  
  8.     proc;  
  9.   t1 := now t1;  
  10.   Result := FormatDateTime('nn:ss.zzz't1);  
  11. end 
  12.   
  13. procedure TFormAnonTiming.btnAnonClick(Sender: TObject);  
  14. var  
  15.   str1: string 
  16.   str2: AnsiString;  
  17. begin  
  18.   str1 := 'Marco Cantù' 
  19.   Memo1.Lines.Add ('AnsiUpperCase (string): '  
  20.     TimeCode (MaxLoop2,  
  21.     procedure ()  
  22.     begin  
  23.       str1 := AnsiUpperCase (str1);  
  24.     end));  
  25.   str2 := 'Marco Cantù' 
  26.   Memo1.Lines.Add ('AnsiUpperCase (AnsiString): '  
  27.     TimeCode (MaxLoop2,  
  28.     procedure ()  
  29.     begin  
  30.      str2 := AnsiUpperCase (str2);  
  31.     end));  
  32. end 

 

 在下面例子妳可以发现一个更轻巧(也更精确的)版本,使用GetTickCount可以而不是以Now函数。虽然你可能寻找更精确计时服务QueryPerformanceCounter API。

 

 

执行标准版本的和依赖匿名方法的将获得如下结果:

 

Classic
AnsiUpperCase (string): 00:00.588
AnsiUpperCase (AnsiString): 00:01.087
Anonymous
AnsiUpperCase (string): 00:00.644
AnsiUpperCase (AnsiString): 00:01.153

 

 就像你所看到的,匿名方法版本的差异8%。是因为直接执行本地代码,程序使用了虚方法调用到匿名函数的实现。这些不同还体现在,测试代码使用更好 的方式。如果需要在代码中用squeeze性能,使用匿名方法,妳不能到直接方式的代码,使用直接函数调用那么快。使用方法指针将可能需要在性能的取舍中 权衡。

 

免责声明:文章转载自《Delphi 匿名函数的几个实际应用(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇APP漏洞自动化扫描专业评测报告(上篇)学习:MFC的CWinApp和CFrameWnd下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

手把手教学在Springboot中搭建使用Guava cache,包教包会,不会我输一包辣条给你

 guava cache使用简介   概述   缓存是日常开发中经常应用到的一种技术手段,合理的利用缓存可以极大的改善应用程序的性能。   Guava官方对Cache的描述连接   缓存在各种各样的用例中非常有用。例如,当计算或检索值很昂贵时,您应该考虑使用缓存,并且不止一次需要它在某个输入上的值。   缓存ConcurrentMap要小,但不完全相同。最...

SpringBoot中前后端数据交互 json 格式

//前端使用jquery封装的ajax技术把封装好的json数据传输给后端 //而在springboot项目中后端自动配置使用了google的jackson把传递给前端的数据自动转换为json格式,当然我们也可以不用默认,自定义设置 $.ajax( { url:"http://www.microsoft.com", //请求的url地址...

java(计算机)常见加密算法详解

  来源:http://blog.csdn.net/janronehoo/article/category/1152295  如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMA...

导出 Excel 模板自动生成规则,避免用户反复修改

一句话总结 Excel 导出、导入时,根据注解自动添加单元格验证规则,避免用户因填写错误的枚举字段而反复修改 Excel 需求背景 对于 Java Web 项目,总是不可避免的出现 Excel 导入、导出的需求,而 Excel 导入导出时,枚举字段和枚举值的映射是非常常见的一种情况 例如:下面这张示例中的性别列 数据库表结构: Excel 中用户需要输入...

大文件上传 之 改版了的SlickUpload.HttpUploadModule(Krystalware.SlickUpload.dll)

以下代码中所注释的部分是所改版的地方。:)Krystalware.SlickUpload.dll/Files/bigmouthz/SlickUpload.rar------------------------------------------------------using System;using System.Collections;using S...

《Zuul网关》之GETPOSTPUT请求报文重组并支持multipart/form-data

1、重组参数 假设需要重新组装的参数如下: @Setter @Getter public class DecodeParameters implementsSerializable{   private static final long serialVersionUID = -874947393093003083830L;   //通用参数   pr...