当前位置: 首页 > news >正文

精确计算代码执行时间

在一些测试工作时我们需要获得高精度的代码执行时间以比较其效率。最近遇到一个模块其执行时间非常短,但是调用频率非常高。精确计算其运算时间对于提高程序整体效率来说非常重要。

      在我刚刚接触.Net时,也曾经想要测试一下自己写的程序的运行时间,当时我使用的是将两个DateTime.Now相减的笨方法,呵呵。后来知道使用Environment.TickCount,对于一般的测试来说就足够了。但是它对于高精度测试就没什么办法,经常是返回个0了事。对于高精度测试我们应当使用QueryPerformanceFrequency函数和QueryPerformanceCounter函数。通过它们可以获得比Environment.TickCount更高的精确度。实际上Environment.TickCount就是在调用QueryPerformanceFrequency函数和QueryPerformanceCounter函数。

      下面是我使用的代码:
using System;

class Class1
{
    [System.Runtime.InteropServices.DllImport (
"Kernel32.dll")]
    
static extern bool QueryPerformanceCounter(ref long count);

    [System.Runtime.InteropServices.DllImport (
"Kernel32.dll")]
    
static extern bool QueryPerformanceFrequency(ref long count);

    [STAThread]
    
static void Main(string[] args)
    
{
        
long count = 0;
        
long count1 = 0;
        
long freq = 0;
        
double result = 0;
        
        QueryPerformanceFrequency(
ref freq);
        QueryPerformanceCounter(
ref count);

                
//需要测试的模块
        
        QueryPerformanceCounter(
ref count1);
        count 
= count1-count;
        result 
= (double)(count)/(double)freq;

        Console.WriteLine(
"耗时: {0} 秒", result);
        Console.ReadLine();
    }

}

      这样能够得到非常精确的结果。但是模块每次运行的时间总会有些误差,而当计算非常精确的时候,这些运行时间的误差也显得比较明显了。为此我对其进行循环多次测试使其误差平均化,通过多次测试的结果来进行执行效率的分析。

using System;

class Class1
{
    [System.Runtime.InteropServices.DllImport (
"Kernel32.dll")]
    
static extern bool QueryPerformanceCounter(ref long count);

    [System.Runtime.InteropServices.DllImport (
"Kernel32.dll")]
    
static extern bool QueryPerformanceFrequency(ref long count);

    [STAThread]
    
static void Main(string[] args)
    
{
        
long count = 0;
        
long count1 = 0;
        
long freq = 0;
        
double result = 0;
        
        QueryPerformanceFrequency(
ref freq);
        QueryPerformanceCounter(
ref count);

        
//开始的时候没有这层循环,所得数据浮动很大,添加这层循环来使得结果更加平均
        for (int i=0; i<500; i++
        
{
                
//需要测试的模块
        }

        
        QueryPerformanceCounter(
ref count1);

        count 
= count1-count;
        result 
= (double)(count)/(double)freq;

        Console.WriteLine(
"耗时: {0} 秒", result);
        Console.ReadLine();
    }

}
 

转载于:https://www.cnblogs.com/AloneSword/archive/2007/06/01/2237552.html


http://www.taodudu.cc/news/show-647359.html

相关文章:

  • 【physx/wasm】在physx中添加自定义接口并重新编译wasm
  • excel---常用操作
  • Lora训练Windows[笔记]
  • linux基础指令讲解(ls、pwd、cd、touch、mkdir)
  • InnoDB 事务处理机制
  • 启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS
  • 理解 ActivityExecutionContextManager
  • Linq 演变的过程(delegate = Lamb = Linq)
  • 光阴四载,梦想在望
  • CSS常用文本属性
  • VSS2005 添加文件夹方法!
  • 一个不错的SQL储存过程分页,储存过程+Repeater,如果只是浏览数据的话,快就一个字...
  • DotNetNuke与MemberShip的结合(五年版) 三步汇总
  • 快速恢复Word、Excel的默认初始设置
  • AnkhSVN 1.0.2778 简体中文版发布
  • [转]获取xml节点值和属性值(兼容ie和firefox)
  • 请问如何把.net framework框架集成在安装程序里头?
  • 修改资料时碰到的问题,
  • 过滤脚本(C#,script,iframe,html)
  • 聊聊我对黑客技术的思考
  • 以Post方式发送数据采用WebClient
  • 今天20号!
  • discuz nt 安装,完全攻略。
  • SQL概述及在网络安全中的应用
  • F41G-UT 安装Windows server 2003系统后无法安装显卡驱动的解决办法
  • 《算法设计与分析基础》Chapt 2 算法效率分析基础
  • [转]C#中得到程序当前工作目录和执行目录的一些方法
  • MySQL 同步(三)不同版本问题
  • 在SQLSERVER EXPRESS 2005中安装northwind和pubs数据库。
  • ASP.NET中的状态管理
  • 水晶报表在浏览时,工具栏上的图标变成的X
  • [分享]极富挑战性的大公司面试的智力题
  • 简单是一种美:提高项目成功率的一些方法
  • 笔记本应用/测试软件大全(个人使用心得)
  • 解析oracle的rownum
  • 在Flash中调用xml文档