Graphic32中TBitmap32.TextOut性能分析[转载]
转载: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?
- var
- Extent: TSize;
- begin
- UpdateFont;
- if not FMeasuringMode then
- begin
- if FClipping then
- ExTextOut();//节省码字时间,括号内参数省略
- else
- ExTextOut();
- end;
- Extent:= TextExtent(Text);
- Changed(MakeRect(....));
- 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性能分析[转载]的更多相关文章
- 用Chrome开发者工具做JavaScript性能分析
来源: http://blog.jobbole.com/31178/ 你的网站正常运转.现在我们来让它运转的更快.网站的性能由页面载入速度和代码执行效率决定.一些服务可以让你的网站载入更快,比如压缩J ...
- MySQL 索引性能分析概要
上一篇文章 MySQL 索引设计概要 介绍了影响索引设计的几大因素,包括过滤因子.索引片的宽窄与大小以及匹配列和过滤列.在文章的后半部分介绍了 数据库索引设计与优化 一书中,理想的三星索引的设计流程和 ...
- 【转载】推荐5款超实用的.NET性能分析工具
来源:http://www.csdn.net/article/2012-11-23/2812174-5-Good-and-useful-.NET-Profilers 虽然.NET框架号称永远不会发生内 ...
- SQL中利用DMV进行数据库性能分析
相信朋友对SQL Server性能调优相关的知识或多或少都有一些了解.虽然说现在NOSQL相关的技术非常的火热,但是RMDB(关系型数据库)与NOSQL是并存的,并且适用在各种的项目中.在一般的企业级 ...
- 在VS 2015中边调试边分析性能
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 对代码进行性能分析,之前往往是一种独立的Profiling过程,现在在VS 2015中可以结 ...
- CentOS6中OpenMP的运行时间或运行性能分析
OpenMp作为单机多核心共享内存并行编程的开发工具,具有编码简洁等,容易上手等特点. 关于OpenMP的入门,博主饮水思源(见参考资料)有了深入浅出,循序渐进的分析.做并行开发,做性能分析是永远逃避 ...
- MySQL监控、性能分析——工具篇(转载)
MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析.监控预警.容量扩展议题越来越多.“工欲善其事,必先利其器”,那么我们如何在进行MySQL性能分析.监控预 ...
- 性能分析工具gprof介绍(转载)
性能分析工具gprof介绍Ver:1.0 目录1. GPROF介绍 42. 使用步骤 43. 使用举例 43.1 测试环境 43.2 测试代码 43.3 数据分析 53.3.1 flat profil ...
- 面试中常用排序算法的python实现和性能分析
这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数学,但是自己还是比较讨厌繁琐的公式,所以基本上文章所有的逻辑,我都尽可能的用大白话 ...
随机推荐
- ubuntu server设置时区和更新时间
ubuntu server设置时区和更新时间 今天测试时,发现时间不对,查了一下时区: data -R 结果时区是:+0000 我需要的是东八区,这儿显示不是,所以需要设置一个时区 一.运行 ...
- MySQL增加列,修改列名、列属性,删除列
mysql修改表名,列名,列类型,添加表列,删除表列 alter table test rename test1; --修改表名 alter table test add column name v ...
- linux手动或者自动启动oracle11g的服务 Oracle 自动启动脚本
手动启动: [oracle@localhost ~]$ sqlplus SQL*Plus: Release 11.2.0.1.0 Production on Wed Mar 26 23:39:52 2 ...
- 20145212 《Java程序设计》第5周学习总结
20145212 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 1.Java中所有错误都会被打包为对象,通过try和catch语法可以对代表错误的对象做处理. try{ . ...
- SimPholders Xcode快速访问沙盒
SimPholders
- FPS
游戏的FPS跟什么有关 http://zhidao.baidu.com/link?url=jZJoN_-MTC9fWCBSBaL5vezBp13MRSv8PdCcQMbwX5tiFGzxNEHe7UB ...
- Window 中安装python多版本环境
由于python 3 已是目前稳定,且是将来版本版本.新学者可以直接从python3入手学习.但是目前还有很多企业级应用使用的是python 2,可能还得要维护.所以,我们在本地windows中可以安 ...
- phpmyadmin查看创建表的SQL语句
本人菜鸟 发现创建表的SQL语句还不会 直接phpmyadmin解决的 查看见表的语句除了直接到处SQL格式文件 打开查看外 就是执行语句查询 语句:show create table 表名 貌似大 ...
- Yii2 前台用户与后台用户分离
1.将common/models/User.php在当前目录下copy一份,命名为Admin.php,修改类的名称为Admin 2.将common/models/LoginForm.php复制到bac ...
- [bug] 未能加载文件或程序集“SIPEPS, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。
摘要 在弄ucma的web项目中总会出现这个问题.尝试了很多方法,最后这样解决了. 解决方案 使web以64位的方式运行.