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

     

  • 相关阅读:
    第15周作业
    迟到的第14周作业
    第13周作业集
    第11次作业--字符串处理
    找回感觉的练习
    第9次作业--接口及接口回调
    20194684 + 自动生成四则运算题第一版报告
    css的calc在less文件中计算有误问题
    react 细节整理
    js async属性
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254699.html
Copyright © 2011-2022 走看看