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

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性能,使用匿名方法,妳不能到直接方式的代码,使用直接函数调用那么快。使用方法指针将可能需要在性能的取舍中 权衡。

 

原文地址:https://www.cnblogs.com/luckForever/p/7254699.html