转载: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;
var
Extent: TSize;
begin
UpdateFont;
if not FMeasuringMode then
begin
if FClipping then
ExTextOut();//节省码字时间,括号内参数省略
else
ExTextOut();
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。

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

Graphic32中TBitmap32.TextOut性能分析[转载]的更多相关文章

  1. 用Chrome开发者工具做JavaScript性能分析

    来源: http://blog.jobbole.com/31178/ 你的网站正常运转.现在我们来让它运转的更快.网站的性能由页面载入速度和代码执行效率决定.一些服务可以让你的网站载入更快,比如压缩J ...

  2. MySQL 索引性能分析概要

    上一篇文章 MySQL 索引设计概要 介绍了影响索引设计的几大因素,包括过滤因子.索引片的宽窄与大小以及匹配列和过滤列.在文章的后半部分介绍了 数据库索引设计与优化 一书中,理想的三星索引的设计流程和 ...

  3. 【转载】推荐5款超实用的.NET性能分析工具

    来源:http://www.csdn.net/article/2012-11-23/2812174-5-Good-and-useful-.NET-Profilers 虽然.NET框架号称永远不会发生内 ...

  4. SQL中利用DMV进行数据库性能分析

    相信朋友对SQL Server性能调优相关的知识或多或少都有一些了解.虽然说现在NOSQL相关的技术非常的火热,但是RMDB(关系型数据库)与NOSQL是并存的,并且适用在各种的项目中.在一般的企业级 ...

  5. 在VS 2015中边调试边分析性能

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 对代码进行性能分析,之前往往是一种独立的Profiling过程,现在在VS 2015中可以结 ...

  6. CentOS6中OpenMP的运行时间或运行性能分析

    OpenMp作为单机多核心共享内存并行编程的开发工具,具有编码简洁等,容易上手等特点. 关于OpenMP的入门,博主饮水思源(见参考资料)有了深入浅出,循序渐进的分析.做并行开发,做性能分析是永远逃避 ...

  7. MySQL监控、性能分析——工具篇(转载)

    MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析.监控预警.容量扩展议题越来越多.“工欲善其事,必先利其器”,那么我们如何在进行MySQL性能分析.监控预 ...

  8. 性能分析工具gprof介绍(转载)

    性能分析工具gprof介绍Ver:1.0 目录1. GPROF介绍 42. 使用步骤 43. 使用举例 43.1 测试环境 43.2 测试代码 43.3 数据分析 53.3.1 flat profil ...

  9. 面试中常用排序算法的python实现和性能分析

    这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数学,但是自己还是比较讨厌繁琐的公式,所以基本上文章所有的逻辑,我都尽可能的用大白话 ...

随机推荐

  1. ntp服务器搭建与客户端设置

    服务器对时间要求非常严格,linux服务器文件的生成,日志,以及数据库的连接都是根据时间的逻辑 进行任务处理,如果时间不同步,那么,处理的任务,以及出问题的分析日志,时间不对,很难分析 直接更改lin ...

  2. eclipse自动部署问题

    1. 使用myeclipse自动部署的方法(使用myeclipse 2015自动部署有问题,待解决)(换成2014的便可以自动部署): 1.Window->preferences->Mye ...

  3. STL vector用法介绍

    STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...

  4. 通过Unity3D制作天空盒

    1. 将全景图片转换为6面的立方体 最初的原始图片 通过PTGui 软件将图片分解为6个部分 2. 通过Unity进行操作 创建3D项目工程 将之前的6张图片导入到Assets中 创建一个Metria ...

  5. 开源License

    http://www.open-open.com/bbs/view/1319816219625 http://my.oschina.net/yangsheng/blog/190917

  6. yourphp点击刷新验证码

    加入css <script type="text/javascript" src="./Public/Js/my.js"></script&g ...

  7. 如何让Chrome浏览器可以加载本地XML文件?

    Chrome浏览器的安全限制,禁止本地加载XML等外部文件,如何设置让其可以加载呢? 有两种方法,第一种是在本地服务器环境下浏览,采用 http://localhost/ 的方式浏览你的网页和文件,就 ...

  8. mysqlbinlog恢复数据-update20140820

    mysqlbinlog恢复数据 BINLOG就是一个记录SQL语句的过程,和普通的LOG一样.只是它是二进制存储,普通的是十进制存储. ================================ ...

  9. Make命令

    Make命令 一.Make的概念 Make这个词,英语的意思是"制作".Make命令直接用了这个意思,就是要做出某个文件.比如,要做出文件a.txt,就可以执行下面的命令. $ m ...

  10. tamper参数

    "tamper/apostrophemask.py","tamper/equaltolike.py","tamper/greatest.py" ...