高性能定时器(转自codeproject)

看了这篇文章,

http://www.codeproject.com/Articles/2635/High-Performance-Timer-in-C

很不错的方法,虽然平时很少用到这么精确的定时器,但是这里我产生了一个想法,可以使用这个定时器,

用途:

1、 验证算法(code)执行的效率(时间上)

2、用于某些控制场合,比如需要对精确的时间周期

high-performance timer  class:

/// <summary>
    /// A C# class to provide exact time measurement in your applications.
    /// craigtao : 可以用来验证算法的效率如何
    /// </summary>
    internal class HiPerfTimer
    {
        [DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceCounter(
            out long lpPerformanceCount);

        [DllImport("Kernel32.dll")]
        private static extern bool QueryPerformanceFrequency(
            out long lpFrequency);

        private long startTime, stopTime;
        private long freq;

        public HiPerfTimer()
        {
            startTime = 0;
            stopTime = 0;

            if (QueryPerformanceFrequency(out freq) == false)
            {
                // high-PerformanceFrequency counter not supported
                throw new Win32Exception();
            }
        }

        //start the timer
        public void Start()
        {
            //lets do the waiting threads there work
            Thread.Sleep(0);

            QueryPerformanceCounter(out startTime);
        }

        //stop the timer
        public void Stop()
        {
            QueryPerformanceCounter(out stopTime);
        }

        //return the dutation of the timer (seconds)
        public double Duration
        {
            get
            {
                return (double)(stopTime - startTime) / (double)freq;
            }
        }
    }

测试使用:

class Program
    {
        static void Main(string[] args)
        {
            HiPerfTimer pt = new HiPerfTimer(); // create a new PerfTimer object
            pt.Start();

            //the code time
            Console.WriteLine("Jesus loves you!\n");
            Console.WriteLine("Jesus loves you!, you know? \n");

            pt.Stop();

            Console.WriteLine("Duration:{0} sec\n",
                pt.Duration);

            Console.ReadKey();  // for remain console windows
        }
    }

效果:

时间: 2024-10-10 02:30:41

高性能定时器(转自codeproject)的相关文章

高性能定时器时间轮的探究

时间轮的概念 关于定时器有很多种,有基于升序的定时器时间链表,但是这种链表存在效率的不足,就是当插入定时器的时候时间复杂度是O(n).今天,我们来认识一下高性能定时器时间轮. 如上图所示,就是一个时间轮的基本轮廓.一个轮子上有很多槽slot,每一个槽指向一个定时器链表,这个链表是无序的.时间轮每转动一步就会指向下一个槽,其实也可以理解为一个滴答时间成为时间轮的槽间隔si (slot interval).它实际上就是心跳时间.如果该时间轮有n个槽,因此它运转一周的时间是n*si. 如果现在指针指向

iOS 高性能定时器解决方案

最近在做一个电商项目,因为有很多界面有打折商品,打折商品会时间限制,所以里面用到了大量的定时器来算倒计时.每一个页面就是一个定时器.觉得太耗性能,想到了一个比较节约性能的方式.全局就一个定时器,控制全部的界面的倒计时. 项目用的是swift3.0 1.解决思路: 创建一个定时器的类,这个系统也就这一个定时器,定时器里面有一个代理方法,然后定时器执行的方法就是执行者个代理,那个需要用到定时器的界面,就去继承这个代理,然后实现代理的方法就行. 2.代码: 定时器类 import UIKit prot

Linux高性能服务器编程——定时器

 定时器 服务器程序通常管理着众多定时事件,因此有效组织这些定时事件,使之能在预期的时间点被触发且不影响服务器的主要逻辑,对于服务器的性能有着至关重要的影响.位置我们要将每个定时事件封装成定时器,并使用某种容器类型的数据结构,比如链表.排序链表和时间轮将所有定时器串联起来,以实现对定时事件的统一管理. Linux提供三种定时方法: 1.socket选项SO_RECVTIMEO和SO_SNDTIMEO. 2.SIGALRM信号 3.I/O复用系统调用的超时参数 socket选项SO_RCVTI

基于升序定时器的时间链表

李邦柱 [email protected] 1. 定时器简介 定时器通常包含至少两个成员:一个超时时间(通常采用相对时间或者超时时间)和一个超时时间到达后的一个回调函数.有时候还可能包含回调函数被执行时需要传入的参数,以及是否重新启动定时器,更改定时器的超时时间等.如果使用链表作为容器来串联所有的定时器,则每个定时器还要包含指向下一个定时器的指针成员.进一步,如果链表是双向的,则每个定时器还需要包含指向前一个定时器的指针成员. 2. 升序定时器链表的实现 #ifndef LST_TIMER #d

数据结构与算法之美-堆的应用

堆的应用一:优先级队列 优先级队列首先应该是一个队列.队列最大的特性就是先进先出.但是在优先级队列中,出队顺序不是先进先出,而是按照优先级来,优先级最高的,最先出队. 用堆来实现优先级队列是最直接.最高效的.这是因为,堆和优先级队列非常相似.一个堆就可以看作一个优先级队列.很多时候,它们只是概念上的区分而已. 往优先级队列中插入一个元素,就相当于往堆中插入一个元素.从优先级队列中取出优先级最高的元素,就相当于取出堆顶元素. 很多数据结构和算法都要依赖它.比如,赫夫曼编码.图的最短路径.最小生成树

数据结构和算法-堆

堆的定义 必须是一个完全二叉树(除了最后一层, 每个节点都有两个子节点, 最后一层只能缺少若干个右节点) 堆中每一个节点的值都必须>=(大顶堆)或<=(小顶堆)左右子树节点的值 堆中节点的关系 下标为i节点的父节点序号是i/2 下标为i节点的左子树节点时2*i, 右子树节点是2*i+1 完全二叉树特点: 如果一个完全二叉树有n个节点, 那么从n/2+1个节点开始到n都是叶子节点 构造最小二叉堆 # coding:utf-8 """ 空间复杂度: O(1) 原地排序

《Linux高性能服务器编程》学习总结(十一)——定时器

第十一章 定时器 这里的定时器主要指的是定时器容器,TCP连接中有保活定时器,为了定期查看TCP连接是否断开,可以用socket选项实现,但是较为麻烦,所以一般都由应用层负责保活,这是定时器的一个运用场景,或者在应用层需要执行一些定时操作,这样就需要一个高效的定时器容器,主要是时间轮和时间堆,当然定时器也可以用SIGALRM信号以及I/O复用实现. socket选项中我们使用SO_RCVTIMEO和SO_SNDTIMEO两个选项进行设置,我们来看一个例子: 1 /****************

【JavaScript】【译】编写高性能JavaScript

英文链接:Writing Fast, Memory-Efficient JavaScript 很多JavaScript引擎,如Google的V8引擎(被Chrome和Node所用),是专门为需要快速执行的大型JavaScript应用所设计的.如果你是一个开发者,并且关心内存使用情况与页面性能,你应该了解用户浏览器中的JavaScript引擎是如何运作的.无论是V8,SpiderMonkey的(Firefox)的Carakan(Opera),Chakra(IE)或其他引擎,这样做可以帮助你更好地优

Golang中使用heap编写一个简单高效的定时器模块

定时器模块在服务端开发中非常重要,一个高性能的定时器模块能够大幅度提升引擎的运行效率.使用Golang和heap实现一个通用的定时器模块,代码来自:https://github.com/xiaonanln/goTimer 也可以查看文档:http://godoc.org/github.com/xiaonanln/goTimer,下面是完整的代码,并进行适当的注释和分析. 从性能测试结果来看,基于heap的定时器模块在效率上并不会比时间轮(TimeWheel)的实现慢多少,但是逻辑上要简单很多.