转载: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. Android学习笔记——LinearLayout

    该工程的功能是实现LinearLayout 以下的代码是MainActivity.java中的代码 package com.example.linearlayout; import android.a ...

  2. (转)深入理解Java中的final关键字

    转自:http://www.importnew.com/7553.html Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方 ...

  3. strcpy函数的实现

    strcpy函数的实现 大家一般认为名不见经传strcpy函数实现不是很难,流行的strcpy函数写法是: char *my_strcpy(char *dst,const char *src) { a ...

  4. C++strng流(入门级)

    /************************************************************************* * * FILENAME: stringTest. ...

  5. nginx重定向配置

    # /etc/nginx/nginx.conf #写在server,location核心模块中,if也可以写.$http_host客户端设法要到达主机的主机名 if ($http_host !~ “^ ...

  6. 利用Ramdisk为Firefox 加速

    用Firefox的人可能会羡慕Chrome的速度,但是又不舍得丢弃Firefox.Firefox的加速,可能通过一系列的方法,例如用fasterfox扩 展.但利用虚拟内存盘 Ramdisk ,将将内 ...

  7. 如何在ubuntu中启用SSH服务

    如何在ubuntu14.04 中启用SSH服务 开篇科普:  SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为 ...

  8. CO-类的本质、description方法

    类的本质 1. 类也是个对象 其实类也是一个对象,是Class类型的对象,简称“类对象” Class类型的定义 typedef struct objc_class  *Class; 类名就代表着类对象 ...

  9. mysql SELECT FOR UPDATE语句使用示例

    以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式:SELECT ... LO ...

  10. php对uploads文件的处理问题的解决

    解决uploads问题的要点有几点: 参考这篇文章 第一, 在php.ini文件中, 有file_uploads这一节 file_uploads = On ;是否开启文件上传功能, 该功能有很大的安全 ...