计算机软件水平考试:C Q&A:性能优化

文章作者 100test 发表时间 2007:03:13 22:09:11
来源 100Test.Com百考试题网


分配大量小型类对象(如:10,000小型记录)最快和最佳方法是什么? 当然,MFC 序列流化对象可以完成所需的任务。但是,内存的分配和销毁相当耗时。有没有办法对此进行改进?
我无法告诉你最好的方法,因为那取决与应用程序的具体情况和其使用方式。性能和内存分配是如此巨大的一个主题,有关它们已经有很多很多书籍。没有哪一种方案适合所有的情形。最优化总是需要在速度和其它资源之间进行明智的权衡。例如,如果你愿意建立巨型索引,那么就会获得非常快的查询速度。或者要想显示速度快,那么就得以加载时间作为代价。因此,本文我只能就某些需要考虑的问题给你提供一个概述,以及提供一些工具和途径以帮助你自己找到答案。
  如果你觉得程序的性能不太满意,首先必须确定瓶颈在哪,对此要有清醒的认识。你可以借助复杂的工具(profiler)来产生各种有关性能的报告,但如果只是想知道你的代码在哪里耗时,那么用一些自己编写的简单工具即可,我写了一个类叫 ShowTime,它可以报告代码的某些部分执行时要花费多长时间。为了使用它,你只需在要用时钟的代码块起始处实例化一个 ShowTime 堆栈对象即可:
void CalculatePi()

{ 

   ShowTime st("Calculating pi").

   // do it

}

这段代码将产生一个象下面这样的 TRACE 信息:
Calculating pi: 342 msec

  ShowTime 是如何工作的呢?它为智能指针以及在代码块起始处和末尾处你想做某些自动处理的地方使用常见的 C 构造函数/析构函数(ctor/dtor)模式。ShowTime 的构造函数将时钟时间(自从进程启动后的时钟嘀嗒数)保存在某个数据成员中;析构函数则用从最后的时钟数中减去这个时钟数并产生一条信息。由于构造函数/析构函数是在代码块的起始处/末尾处调用的,这样便测算出总共用了多少时间。代码如 Figure 1 所示。
  ShowTime 并不太复杂。比如,它并不考虑多线程的情况,并且也不报告在每个函数中某个工具消耗了多少时间。但是对于日常使用来说,它能给你提供应用程序在何处耗时的很好的参考。不要忘记针对 Release 版本进行性能测试!毕竟那是你交付使用的版本。此外,Release 和 Debug 版本之间的差别可能会曲解你的结果。例如,依赖你的设置方式,debug 版本也许要进行额外的堆栈,这样便使应用程序性能下降。由于在 Release 版本中没有 TRACE 信息,所以我添加了另外一个类,PerfLog,它可以将性能统计定向到一个文本文件:
// open log file

PerfLog mylog("MyResults.log").

相关文章


系统分析师互助培训之CMM与软件过程改进(四)
系统分析师互助培训之CMM与软件过程改进(三)
系统分析师互助培训之CMM与软件过程改进(一)
系统分析师互助培训之CMM与软件过程改进(二)
计算机软件水平考试:C Q&A:性能优化
C Q&A:控件和组件概念浅析
由模式谈面向对象的基本原则之单一职责原则
封装的变化之排序算法中的封装
封装的变化之封装对象创建的变化
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛