2008年12月10日星期三

解放windows下的std min/max

windows在WinDef.h中定义了min/max,可能会屏蔽掉std::min/max。
解决方法:
#define NOMINMAX

cannot open input file kernel32.lib

装了2003和2008,用2008的nmake编译一个msvc文件时,报错提示找不到kernel32.lib。
搜了一下,只有2003的Vc7\PlatformSDK\Lib目录下才有kernel32.lib,而2008下是没有的。难道这也会ref count?
还有用nmake时,E:\Program Files\Microsoft Visual Studio 9.0\VC\bin目录下没有msobj80.dll,mspdb80.dll,mspdbcore80.dll,mspdbsrv.exe,要从2008的Common7\IDE目录下copy过来。

真是诸多困扰。所谓的n年经验,一部分就是这样的吧。

snprintf in Windows

windows中通过以下声明
#if WIN32
#define snprintf sprintf_s
#endif
来使用snprintf。

2008年11月24日星期一

Sentence from Dict

In the recent crisis no banks could manage to bail out the companies feeling financial pressure.

pread

调用pread/pwrite时,无法中断其定位lseek和读/写操作,原子操作,另外不更新文件指针。

2008年11月10日星期一

Tiny-mce编辑器中的
代替

http://wiki.moxiecode.com/index.php/TinyMCE:FAQ

So if you really really must use BR elements for some odd reason then set this in your init code:

tinyMCE.init({
forced_root_block : false,
force_br_newlines : true,
force_p_newlines : false
});

2008年11月4日星期二

使用swap控制container的capacity

DevC也是个能学到东西的地方。
一些小trick。
C++容器的capacity缩减的方法:使用container自己的swap,
vector tVec;
在执行一些操作之后tVec的capacity可能比实际的size大很多,在某些场合可能需要减少两者的差距。文章介绍使用vector(tVec).swap(tVec);可以使得tVec的capacity等于size,原理是产生一个临时对象,以tVec进行赋值。如果要使得capacity为0的话,可以使用vector().swap(tVec)

2008年10月19日星期日

sprintf, lexical_cast, format效率比较(转载)

由于发现boost::replace_first的效率有些问题(其实是使用的场合问题),刚接触boost::format,找到一篇比较其效率的文章,以后使用的时候,还是要多考虑是否为选择最适合的方法而不是最热门的。以下为转载内容。

 sprintf,lexical_cast,format 三者效率比较收藏

作者: 江淼
Blog: http://blog.csdn.net/jiangfriend
时间: 2007-7-30 00:42

sprintf至C语言流传至今,经久不衰,虽然microsoft好心提供sprintf_s,并发出C4996的警告,我个人是比较不接这个领子。 sprintf安全问题一直被大家质疑,但我觉的出现了安全的问题是设计上的缺陷,正如线程死锁也是设计上的缺陷,一个需要杀死线程的程序绝对不是一个合格的程序。
lexical_cast是boost的成员之一,因为文件比较短,源码走马观花的看过一遍,内部使用的是stream,不过lexical_cast仅仅是个转换,其出现用于代替atoi,这里顺便带过。
format是boost提供的用于格式化的库,我才疏学浅也没时间分析源码,只知道使用方法。有兴趣的可以看看,一定会有不少收获,发出C++原来还能这样用的感叹。

测试
下面对该3各具特色的函数进行效率上的测试。
测试环境:赛扬D2.66G 内存512M,测试状态为日常应用状态(即运行了一些程序)VC8.0

测试程序很简单,简单的循环
for(int i=0;i<1000000;i++)
{
  command;
}

各执行100万次后得出下表

command Release(ns) Debug(ns)  
sprintf(buf,"%d",3); 289769 451770  
lexical_cast(3) 1165520 402.22% 21802420 4826.00%
format("%1%")%3; 14006000 4833.51% 133649200 29583.46%
   
sprintf(buf,"%d %s",3,"Hello"); 527948 828527  
format("%1% %2%")%3%"Hello"; 18745300 3550.60% 178153800 21502.47%
和官方性的性能测式有些出入,诂计是我赛扬的原因且运行了一些程序。

意料之中,sprintf因其没啥"负担"效率手当其冲,功能最复杂的boost.format居于最后。lexical_cast虽然花了400%的时间,相对值虽然大,但绝对值还是可以接受的。

总结
在效率第一的情况下如内核,核心算法,反朴归真是最佳的选择,用c命令代替c++命令等等。
lexical_cast可以用在一般的应用,但如前文所说仅仅单个的格式转换。
format的速度约为15ns/条,比起sprintf着实笨拙,但在高速的计算机面前,一般应用也是绝对可以接受的,虽然多花了三四十倍的时间,但因其具备完全替代sprintf的功能且有过之而无不及,也有一立足之地。