• 获取高精度的时间差,可以用来分析页面运行时间的长短


    DateTime.Now的精度是很低,这个低的意思是,两次获取的DateTime.Now的Ticks的差,只是一个较大数的整数倍。例如在我的机器上,这个差最小是10.114ms。所以,如果我用DateTime.Now来计算时间差,那么就无法精确到10ms以内。

    后来发现ASP.NET的TRACE的精度很高,用Reflector看它的实现,发现了它是使用这两个方法的:

    参考MSDN:How To: Time Managed Code Using QueryPerformanceCounter and QueryPerformanceFrequency

    我自己了按照这个写了个类,代码如下

    using System;
    using System.Runtime.InteropServices;
    public class A
    {
        [DllImport(
    "kernel32.dll")]
        
    static extern bool QueryPerformanceCounter([In, Out] ref long lpPerformanceCount);
        [DllImport(
    "kernel32.dll")]
        
    static extern bool QueryPerformanceFrequency([In, Out] ref long lpFrequency);

        
    static long _f = 0;

        
    static public long GetTickCount()
        {
            
    long f = _f;

            
    if (f == 0)
            {
                
    if (QueryPerformanceFrequency(ref f))
                {
                    _f 
    = f;
                }
                
    else
                {
                    _f 
    = -1;
                }
            }
            
    if (f == -1)
            {
                
    return Environment.TickCount * 10000;
            }
            
    long c = 0;
            QueryPerformanceCounter(
    ref c);
            
    return (long)(((double)c) * 1000 * 10000 / ((double)f));
        }

        
    //GetTickCount()为0时的DateTime.Ticks值
        static long _tc = 0;

        
    //这个返回的不是真正的精确时间,但时间与时间的差是精确的。
        
    //GetExactNow与DateTime.Now的偏差比DateTime.Now的精度还要小,所以该偏差
        static public DateTime GetExactNow()
        {
            
    if (_tc == 0)
            {
                
    long tc = GetTickCount();
                DateTime dt 
    = DateTime.Now;
                _tc 
    = dt.Ticks - tc;
                
    return dt;
            }

            
    return new DateTime(_tc + GetTickCount());
        }
    }

    在ASP。NET的应用,可以在Global.asax的Application_BeginRequest事件中加入代码来纪录程序开始时的TickCount:

    Context.Items["BeginRequestTickCount"]=A.GetTickCount();

    然后在页面输出的后面:

    <html>....
    <div align="center">
    <%=new TimeSpan(A.GetTickCount()-(long)Context.Items["BeginRequestTickCount"]).TotalMilliseconds%>
    </div>
    </body></html>

    这样就可以达到获取页面运行时间值了。(当然输出TotalMilliseconds后Asp.Net还要一些后期工作的,不过这个时间应该只需要0.n ms)

    --

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    禅道,导出选中的用例
    chrome 历史版本下载地址
    在QT中添加zeromq DLL库
    在QT中添加zeromq DLL库
    在QT中添加zeromq库,zeromq的下载编译
    工控软件dll劫持漏洞分析
    [转载]Impost3r:一款针对Linux的密码提取工具
    0MQ绑定Delphi版-说明
    通过Maven导出war包时报错:Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project Ocr: Error assembling WAR: webxml
    价值投资必须掌握的几个指标zz
  • 原文地址:https://www.cnblogs.com/Athrun/p/553863.html
Copyright © 2020-2023  润新知