hubdog 的blog
减小Delphi2010程序的尺寸
由 hubdog 于 星期日, 2010-03-28 02:25 发表因为Delphi2010中引入了新的RTTI反射机制,会导致编译出来的程序很大。禁用RTTI反射可以减小文件的尺寸
在工程的Uses语句前添加下面的定义就可以禁用RTTI反射
{ Reduce EXE size by disabling as much of RTTI as possible (delphi 2009/2010) }
{$IF CompilerVersion >= 21.0}
{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
{$IFEND}
参见http://www.zipplet.co.uk/index.php/content/articles_programming_delphi2010rtti
Flex Builder 4发布了
由 hubdog 于 星期一, 2010-03-22 20:00 发表不知道有啥新特性,就知道专业版便宜了300美元。BlazeDS还没有升级到4.0,不知道为啥
多核时代的多线程性能优化
由 hubdog 于 星期六, 2010-03-13 15:27 发表随着摩尔定律的失效,CPU的计算能力不再是可以廉价获得的无限资源了。在多核时代,提高系统的运行速度,采用并发的多线程无疑是最重要的手段了。
在多核系统中,采用何种并发制御方式会极大的影响系统的运行效率,这两天做了一些实验。通常来说,多线程的并发制御主要分为两大类,一类是Polling的轮询方式,也就是Sleep, SwitchToThread,还有一类就是Blocking的阻塞方式,比如Mutex,WaiteForSingleObject这类方式。
简单实验的结果,发现系统的CPU数目越多,并发的线程数越多,使用阻塞方式进行同期制御的程序会更快一些,同时因为不需要轮询,所以CPU的占用率更低。反之,CPU和并发线程数少的时候, Polling的方式更有优势。
为了测试比较多线程的性能,这次用了Intel的Vtune中的Thread Profiler,发现还是相当好用的,不过要注意Intel Profiler无法直接监视基于内存变量的同期制御。这时要调用Profiler的API来告诉Profiler,同期计数器开始,结束,取得,释放的时间点才行。
受伤了
由 hubdog 于 星期二, 2010-03-09 00:01 发表前两天坐自动扶梯的时候,脚下拌蒜,结果来个后空翻,右边肋骨被磕了一下,这两天好痛,起床都要运半天气。幸好还没有骨折,算是不幸中的万幸。好痛苦呀
如何测试C++类的Private成员和Static函数
由 hubdog 于 星期二, 2010-01-26 22:40 发表这两天在写一个C++类的单元测试,为了确认运行结果,需要访问C++类的Private成员,
为了不修改被测试的C++类的源代码,比较猥琐地使用宏定义将private改成public,
#define private public
#include <xxx.hpp>
...
#undef private
测试static函数,就比较麻烦了
首先要Include相应的c文件,有时交叉引用会导致无法编译通过,相当麻烦。
用C++编译器编译C文件
由 hubdog 于 星期三, 2010-01-13 17:50 发表注意在C的头文件中要加上下面的宏定义
#ifdef __cplusplus
extern "C" {
#endif
C函数定义
#ifdef __cplusplus
}
#endif
或者
extern "C" {
#include "aaa.h"
...
}
libcmt.lib和msvcrtd.lib的冲突问题
由 hubdog 于 星期三, 2010-01-13 17:41 发表今天在编译一个程序时,发生了下面的错误。
libcmt.lib(sprintf.obj) : error LNK2005: _sprintf already defined in msvcrtd.lib(MSVCR80D.dll)
调查发现,编译程序中调用的DLL是使用动态链接进行编译的,但是这个程序又链接了一个使用静态链接的库,这两个库恰好又同时用到了sprintf这个函数,这就导致了命名冲突的问题,将两个库都使用动态链接后就改好了这个问题。
MSDN上有一篇文章讲了静态和动态链接的区别。
http://msdn.microsoft.com/en-us/library/abx4dbyh%28VS.80%29.aspx
在Delphi中创建类似于Printf这样可变参数的函数
由 hubdog 于 星期六, 2009-12-26 22:49 发表Delphi本身是不直接支持写Printf这样的变参函数,Format这样的函数类似于Printf,但是还是要多写两个括号,
我觉得太麻烦,其实我们可以间接的实现这样的函数,懒得解释,贴了段程序
program TestVar;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
type
VA_FN = function(const par1{, ...}: PAnsiChar): Boolean; cdecl varargs;
vsnprintf和wvsprintf的区别
由 hubdog 于 星期六, 2009-12-26 22:43 发表vsnprintf和wvsprintf的唯一区别就是wvsprintf函数不能处理浮点格式化字符串。
倒霉的是Delphi自带的Windows.pas里面只提供了wvsprintf的定义。要想使用vsnprintf,我们需要引用MSVCRT.dll中的
vsnprintf函数
function _vsnprintf(buffer: PAnsiChar; count: size_t; format: PAnsiChar): Integer; cdecl;varargs; external 'MSVCRT.DLL' name '_vsnprintf';