转载:http://blog.csdn.net/avan_lau/article/details/6958497

最近在分析软件中画线效率问题,发现在画一些标志性符号的方法,存在瓶颈,占用较大的时间。而画这些符号的,则最终是调用TBitMap32.TextOut。大致状况如下:

TextOutSignWithAngle为画特殊符号方法,中间调用了API:GetObject用于获取LogFont信息,然后填充logFont角度信息,再调用API:CreateFontIndirect,设置创建后的字体Handle为bitmap32的字体handle,调用BitMap.TextOut,最后删除创建的字体对象。

原本分析代码认为:频繁创建字体并删除,这应该浪费不少时间(参考MSDN有关CreateFontIndirect说明)。后来建立一个字体列表,将创建后的字体,全部记录进去,每次进来先从字体列表中查找,有查到,则直接引用,否则才创建——因为CreateFontIndirect创建字体,可以持续使用。

按上述修改后,再次测试验证,发现性能没有提高多少。进而怀疑Textout应该是瓶颈。依据数据分析,也确实是,如下:

设TextOutSignWithAngle执行15000次,耗时1.40S(包含子方法);调用子方法BitMap32.TextOut,耗时1.20S。

最后分析,TBitmap32.TextOut源码

[delphi] view plaincopyprint?

  1. var
  2. Extent: TSize;
  3. begin
  4. UpdateFont;
  5. if not FMeasuringMode then
  6. begin
  7. if FClipping then
  8. ExTextOut();//节省码字时间,括号内参数省略
  9. else
  10. ExTextOut();
  11. end;
  12. Extent:= TextExtent(Text);
  13. Changed(MakeRect(....));
  14. end;
varExtent: TSize;
begin UpdateFont;if not FMeasuringMode thenbeginif FClipping thenExTextOut();//节省码字时间,括号内参数省略elseExTextOut();  end;Extent:= TextExtent(Text);Changed(MakeRect(....));
end;

依次逐行分析代码性能,除了最终的API:ExTextOut外,最耗时的,则属TExtExtent,计算这个,仅仅为了后续的Changed事件,这在实际画text时,并不需要。

TextExtent耗时为0.42S,而updatefont耗时0.01S,Changed约耗时可忽略不计(应该是没有事件处理)。

由此,我们可以单独使用ExTextout作为文字的输出,再加上最开始的那段字体列表优化,可减少0.5-0.7S。文字输出的耗时,执行15000次的耗时,可控制在0.8S以内。

BTW. 以上性能分析数据,借助于AQTime。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/h2zZhou/p/4718553.html

Graphic32中TBitmap32.TextOut性能分析[转载]相关推荐

  1. 直扩 单音干扰抑制 matlab,单频干扰在直扩系统中的误码性能分析

    收稿日期 :2004 - 05 - 08 收修改稿日期 :2004 - 07 - 28 单频干扰在直扩系统中的误码性能分析 许 靖 谷春燕 易克初 (西安电子科技大学综合业务网国家重点实验室 ,西安 ...

  2. webuploader 怎么在react中_React 项目性能分析及优化

    点击上方"前端技术砖家"关注 性能优化不是一个简单的事情,但在 95% 以上的 React 项目中,是不需要考虑的,按自己的想法奔放的使用就可以了. 我认为性能优化最好的时候是项目 ...

  3. xhprof php5.5,Thinkphp5中配置XHProf性能分析工具

    ThinkPHP中的行为是一个比较抽象的概念,你可以把行为想象成在应用执行过程中的一个动作. 首先,我们在application/tags.php文件中,定义性能分析的行为,分别绑定在app_init ...

  4. 远程教育中教师能力特点分析(转载)

    学生自主学习是远程教育的基本特性.自主学习是指学生可以对学习作自由的.灵活的安排或选择.远程教育产生和发展的基本动因和目的就是要有效地实现学生的这种安排和选择.因此,从这一意义上说,学生自主学习是远程 ...

  5. Java 集合中的方法性能分析

    文章目录 前言 一.List集合 1.1.Collection 中 get() 和 remove()方法的效率 示例一 示例二 总结 前言 暂无 一.List集合 1.1.Collection 中 g ...

  6. 独家揭秘!阿里大规模数据中心的性能分析

    阿里妹导读:数据中心已成为支撑大规模互联网服务的标准基础设施.随着数据中心的规模越来越大,数据中心里每一次软件(如 JVM)或硬件(如 CPU)的升级改造都会带来高昂的成本.合理的性能分析有助于数据中 ...

  7. 独家揭秘!阿里大规模数据中心的性能分析 1

    2019独角兽企业重金招聘Python工程师标准>>> 阿里妹导读:数据中心已成为支撑大规模互联网服务的标准基础设施.随着数据中心的规模越来越大,数据中心里每一次软件(如 JVM)或 ...

  8. 阿里大规模数据中心性能分析

    郭健美,阿里巴巴高级技术专家,目前主要从事数据中心的性能分析和软硬件结合的性能优化.CCF 系统软件专委和软件工程专委的委员.曾主持国家自然科学基金面上项目.入选上海市浦江人才计划A类.获得 ACMS ...

  9. gbd 分析core文件_Go 性能分析工具 pprof 入门

    (给Go开发大全加星标) 来源:wudaijun https://wudaijun.com/2018/04/go-pprof/ [导读]pprof是golang用于性能分析的工具.可以生成图形和文本报 ...

最新文章

  1. php中使用mysql_fetch_array输出数组至页面中展示
  2. 网络营销——网站在网络营销优化中不收录了怎么办呢?
  3. acm pc^2的配置与使用
  4. [模版] 网络流最大流、费用流
  5. pl/postgresql_将PostgreSQL PL / Java安装为PostgreSQL扩展
  6. Query Ajax 实例 ($.ajax、$.post、$.get)
  7. js jq 一些属性
  8. xampp mysql是空的_xampp中修改mysql默认空密码(root密码)的方法分享
  9. Android 8.0 学习(17)---Android8.0中对指纹的新要求
  10. linux oracle 删除为空的dbf,Linux上Oracle误删除一个没有用的dbf表空间文件
  11. 画PCB开始前的准备工作
  12. Android 使用WakeLock
  13. Oracle 归档模式的打开及关闭
  14. python安装汉化插件及翻译插件
  15. 4WRLE27Q3-600M-4X/MXY/24A1比例先导方向阀
  16. deeping(linux)双系统windows启动界面花屏问题的完美解决。
  17. 计算机科学教学指导委员会,教育部高等学校计算机专业教学指导委员会委员 徐久成教授...
  18. LZW编码算法原理及实例应用
  19. Plague Inc
  20. 奔跑吧恐龙----基于JavaSwing的一个跑酷游戏

热门文章

  1. MHA简述与项目案例
  2. linux报错Loading mirror speeds from cached hostfile解决方法
  3. 第六讲:STM32F4芯片解读
  4. 垃圾邮件的判定标准与识别方法
  5. 使用Termux软件在安卓手机上安装ubuntu
  6. date 显示日期月份用英文缩写表示
  7. Mac版微信内存飙升卡死解决办法
  8. 编程的第二个十年:关于Real™编程器的全部
  9. 素数总结(包含素数表)
  10. 秒杀全网!研发、运营必备实用工具网站