`
窗户纸
  • 浏览: 19451 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

面向对象软件开发的后期调优系列之一 : 用好计时器

 
阅读更多

当今社会的程序员聚在一起争论的,往往是哪种开发语言好,于是乎JAVA、C++、c#等等程序员之间必定要掐的一塌糊涂,都觉得自己的好别人的差,(现在貌似C#4.0也开始鄙视C#2.0了,不知何时是个头). 但站在软件开发角度讲,所有程序开发出来的应用都不可避免的面临着后期优化的问题,只要优化得当,各种语言其实都可以达到很理想的执行效率的。

《软件分层开发架构的另一种思考》博文中,我们已经探索了优化的原因及细节。而所用的手段,诸如多线程、异步处理、并发处理、数据缓存应用是各种语言都可以实现的(除了悲催的Javascript),我在此仅以C#做个例子,其实这些方法是放之四海皆可的。

如果一个飞行队要摧毁某个目标,首先做的不是往飞机上装,而是侦查,目标位置在哪里,路径的地形及防御情况如何,目标采用何种才能摧毁等等。对于软件优化也是同样,很多开发小组经常对优化的有效方式摸不到头脑,采用很多方法,越做越差,最后只好回滚。他们往往是采用猜测的方式,比如是不是数据库没加索引表,是不是没有采用异步,需不需要调用外部API等等,于是大手大脚胡改一气。而能够预先了解症结所在,再有针对性的优化,才会是更有效优化的途径。

我们使用的各种调试环境,都有着很丰富的调试工具,诸如变量监视、单步运行、断点、调试堆栈等等等等,但如果要了解特定程序运行过程的各个模块的运行时间,往往要借助我们自己的小工具了。

下面的历程就是我所用的一个简单计时器,该计时器使用singleton模式,只允许一个实例存在,因此可以运行在系统的各个组件中进行同源的检测,检测结果写入日志文件中,这样对于多线程运行环境可以很快了解各个功能点的运行效率,需要注意的是写入日志的过程需要约3ms左右。

public   class T_DebugPerformanceCounter
    {
        [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);

        public static T_DebugPerformanceCounter FactoryTimer()
        {
            if (_MeTimer == null)
            {
                _MeTimer = new T_DebugPerformanceCounter();
            }
            return _MeTimer;
        }

        //==================================================================
        private static long _Frequency;
        private   long _StartCount;
        private T_DebugPerformanceCounter()
        {
            QueryPerformanceFrequency(ref _Frequency);
            
        }
        private static T_DebugPerformanceCounter _MeTimer;
        public void StartCount()
        {
            QueryPerformanceCounter(ref _StartCount);
        }

        public void PerformCount(string info)
        {
            long count1 = 0;
            double result = 0;              

            QueryPerformanceCounter(ref count1);
            long p = count1 - _StartCount;
            result = (double)(p) / (double)_Frequency*1000;
            UtiltyObj.WriteExceptionToLog(string.Format(info + "耗时: {0} 毫秒", result), System.Diagnostics.EventLogEntryType.SuccessAudit , EventLevel.运行 );
        }        
    }



在实际使用中,我们可以在一个程序入口实例化并启动计时器,然后在合适时候多次记录检测结果,如
....
public void Mytest(int col)
{
T_DebugPerformanceCounter u = T_DebugPerformanceCounter.FactoryTimer();
u.StartCount();
u.PerformCount(string.Format("开始加载列{0}的数据\n", p));
int p = MyFunc1();
u.PerformCount(string.Format("完成加载列{0}的数据\n", p));
}

可以看到,这个计时器非常简单,使用也很容易,它起到的作用却非常大,很多情况下,尤其是多线程编程,影响性能的是最慢的一个分支,如果找不到这一分支,在其他细节上的调整都是徒劳的。

而通过加载了计时器,我们在项目优化中发现了一个有趣的现象,初期绝大部分的性能问题来自系统的BUG,而不是数据库存取、装箱拆箱等我们认为会影响性能的地方。


分享到:
评论

相关推荐

    实验:用打点计时器测速度.doc

    "实验:用打点计时器测速度" 本实验的主要目的是使用打点计时器来测量速度。实验中,学生将学习如何使用打点计时器来测量物体的速度,并了解到不同类型的打点计时器的工作原理和优缺点。 知识点一:打点计时器的...

    基于FPGA的Verilog语言的计时器和倒计时的系统设计

    1.计时器:24小时计时器由2个60进制加计数器和I个24进制加计数器构成,输入CLK为1Hz(秒)的时钟,经过60进制加计数后产生1分钟的进位时钟信号,再经过60进制加计数后产生I小时的进位时钟信号送给24进制加计数器进行加...

    VB:高精度计时器控件

    在VB(Visual Basic)编程环境中,开发高精度的计时器功能对于许多应用程序,特别是工控和检测领域,是至关重要的。传统的VB Timer控件虽然简单易用,但其精度通常只能达到几十毫秒,这对于需要精确到1毫秒的应用来...

    课程设计:手机通话计时器设计

    计时器需具备暂停、继续、停止以及清零等功能,并且在设计中使用了Multisim软件进行仿真验证。以下是关于这个设计的详细知识点: 1. **计时器基本原理**:计时器的核心是时序逻辑电路,通常由触发器、计数器等组成...

    FLASH倒计时器(PPT文档).ppt

    FLASH 是一种多媒体软件平台,由 Adobe 公司开发,主要用于创建多媒体内容,如动画、游戏、广告和交互式应用程序。FLASH 广泛应用于网络、电子商务、教育和娱乐等领域。 FLASH 倒计时器是 FLASH 平台上的一种常用...

    Java面向对象编写一个计时器

    在Java编程语言中,面向对象(Object-Oriented Programming,OOP)是一种核心特性,它允许我们通过模拟现实世界中的实体来设计和构建软件。在本主题中,我们将讨论如何利用面向对象的思想来创建一个计时器类。计时器...

    辩论赛计时器

    这款计时器是基于Delphi编程语言开发的,Delphi是一种强大的面向对象的编程环境,以其高效、易用而著称。在教育系统应用中,这样的计时器能够有效地提升比赛的规范性和公正性。 Delphi源码是程序的核心部分,它包含...

    windows桌面计时器

    Windows桌面计时器是Windows操作系统中一种实用的工具,它可以帮助用户进行...而Debug文件可能是开发者在调试程序时生成的,与计时器功能的使用直接关系不大,但在软件开发过程中起着重要作用,用于检测和修复错误。

    MFC 从0开始的计时器

    虽然这个计时器可能不够精确,但它是学习MFC和Windows编程的一个好起点,可以帮助开发者理解如何在Windows环境中使用定时器功能。随着技能的提升,可以进一步优化计时器的精度,以满足更复杂的需求。

    PC上网计时器(即:程序猫上网计时器)

    PC上网计时器是绿色软件,无需安装,直接运行即可,是一款功能强大、专业、易用、实用的上网计时软件。 注意:PC上网计时器记录的是本地机的上网时间,可供用户参考。真正的上网时间以网络服务提供商的为准。

    组态王计时器控件及使用文档

    组态王计时器控件是一款专为工控软件设计的组件,用于实现自动化系统中的时间控制功能。在工业自动化领域,计时器是不可或缺的一部分,它能够帮助工程师精确地控制设备运行的时间,从而实现定时启动、定时停止、周期...

    计时器(演讲赛计时专用)

    【计时器(演讲赛计时专用)】是一款基于VB编程语言开发的实用工具,专为演讲比赛或竞选活动设计,旨在提供一个免费且高效的计时解决方案。在组织此类活动时,确保每位选手的演讲时间公正准确至关重要,而这款计时器...

    PCB: 多功能计时器JXJ1S008O(20200529)

    5. **嵌入式系统开发**:计时器作为一个嵌入式系统,涵盖了硬件设计(如PCB、单片机、电池)和软件开发(如固件、用户界面)。开发过程涉及原理图设计、PCB布局、编程、调试等多个环节。 6. **电子设备电源管理**:...

    模仿小米计时器

    计时器的初始化工作通常涉及到创建一个计时器对象,设置初始时间,并开启计时器。在编程中,我们可以使用各种编程语言(如Java、Python或C#)中的定时器类来完成这一操作。例如,在JavaScript中,可以使用`...

    delphi做的计时器,简单,实用性好

    Delphi是一款强大的面向对象的编程环境,主要用于开发Windows应用程序。在Delphi中,计时器(Timer)组件是实现定时任务的重要工具,它允许开发者在指定的时间间隔内执行特定的代码段。本项目中,"delphi做的计时器"是...

    组态王秒计时器编程方法

    1. 打开组态王软件,新建一个工程,并在画布上选择“动态对象”类别,找到“计时器”或者“数字显示”组件。 2. 拖拽计时器组件到画布上,设置其外观和大小,如边框、颜色等,使其符合界面设计要求。 3. 双击计时器...

    多功能计时器-倒计时器

    "多功能计时器-倒计时器"这款应用程序,正如其标题所示,旨在提供一种高效且灵活的计时解决方案,适应多种场景的需求。 首先,我们来详细探讨倒计时器的核心功能。倒计时器是一种能够从预设时间开始向零倒数的计时...

    计时器倒计时器裁判员专用

    在软件开发领域,计时器和倒计时器是常见的功能模块,广泛应用于各种应用中,如体育赛事、考试计时、健身训练等。计时器用于记录从某个时间点开始流逝的时间,而倒计时器则从设定的时间点开始向零倒数。这两个功能的...

    基于C51单片机计时器

    1)上电启动后,时钟计时,显示器显示00:00,并开始计时,每过1秒加1,直至59:59,再加1回到00:00,循环一次是60分钟,计时结束后蜂鸣器响一声报警提示。 2)按下K1键后,选择秒表计时,显示器显示00:00,每过1秒加1...

    PPT演讲倒计时器

    总结来说,PPT演讲倒计时器是提升演讲效果的有力辅助工具,通过精准的时间管理,帮助演讲者更好地把控演讲节奏,确保信息传递的高效性和完整性。无论是在学术报告、产品推介还是教育培训中,它都能成为你不可或缺的...

Global site tag (gtag.js) - Google Analytics