摘要:
奇怪,在我的电脑上第一次打开Visual Studio 2010要8秒左右,而关掉后再次打开,则只要2秒左右, 这是为什么?好吧,你肯定知道是Windows在背后搞的鬼,你甚至知道我们分别把他们叫做冷启动(cold start)和热启动(warm start), 可是Windows到底做了什么而产生如此大的区别呢?任务管理器几乎每天都在用,可是其"性能"那一页的内容未必全看的懂;Process e... 阅读全文
摘要:
前段时间做了个raytracing的程序,过程是从两个文件分别读入所有的ray和triangle,通过计算把所有的交点输出到一个文件。这里不打算讨论计算过程中算法的优化,主要是谈谈关于文件操作的一些想法。一开始用的是C++标准库提供的ifstream和ofstream, 读写操作类似于:结果发现这样的文件读写相当慢,比如说,在我双核2.16GHz,7200rpm的机子上,写2M的数据花了将近1s。... 阅读全文
摘要:
C++代码一直以其运行时的高性能高调面对世人, 但是说起编译速度,却只有低调的份了。比如我现在工作的源代码,哪怕使用Incredibuild调动近百台机子,一个完整的build也需要四个小时,恐怖!!!虽然平时开发一般不需要在本地做完整的build,但编译几个相关的工程就够你等上好一段时间的了(老外管这个叫monkey around,相当形象)。想想若干年在一台单核2.8GHZ上工作时的场景 - ... 阅读全文
摘要:
2009年就如此过去了,4个季度,12个月,365天就这么过去了而我却没什么特别的感觉,可能是因为没做出什么让自己印象深刻的事吧。前两天看到韩寒的一篇博客:生而为向小孩们吹牛,很是感慨如此平平淡淡将来如何给自己的孩子讲故事。盘点一下09年做过的一些还有些意义的事吧。关于生活 拿到驾照 从4月份开始吧,大概学了4个月,当初的考虑是反正学车是早晚的事,趁现在还没孩子,先学掉算了。于是拉了我们公司两个人... 阅读全文
摘要:
做当前这个项目也快一年半了,回头看看,前一年时间是在做重构,而后一年时间则是在打造一个新的产品。这里稍微总结一下做重构时所学到的一些东西吧。重构其实可以是不同目标的,有些人重构是为了让代码更合理,美观;而另一些人则可能是为了实现某个功能;重构也是有不同程度的,有的可能只是在函数、类级别做些修改,而有些则是要对整个的架构,模块做变动;同时重构的投入也是有很大不同的,有的只是在遇到不好的代码或设计的时... 阅读全文
摘要:
我们知道,在Windows下是不区分大小写的,比如文件名,文件夹名,命令行参数以及注册表表项等等。这在提供我们方便的同时也把我们培养的不那么严谨,出错也就在所难免。 这是最近发生在我们公司的两个真实的案例。 1. Bin目录和bin目录 软件所有的DLL都是在Bin目录下的,有同事在fix一个defect的时候,需要判断某个DLL是否在这个Bin目录下,遗憾的是,这个判断他是用case se... 阅读全文
摘要:
如果你是一个程序员,而且恰好对写写代码有那么丁点兴趣的话,恐怕你会有一些属于自己的代码,这可以是你学习过程中的练习,解决问题的工具,或者纯粹就是发自兴趣的研究~~~而且你也希望有个比较好的方法来管理他们。同学毕业后一直在兼职做网站,卖空间域名,前几天在他服务器上"kiang"来了一个SVN的repository过来,很是开心 - 自己的代码终于也走上了"一处保存,多出访问"的道路。其实之前也在网上... 阅读全文
摘要:
如果你是C++程序员,我想你可能遇到过这样的情况:在debug时,对着一个函数step into,明明调用的是A函数,可是结果却跳进了B函数。为什么,call stack里显示的也是明明白白,就是直接进了B函数。百思不得其解,于是你怀疑是不是系统出了问题,是不是编译器出了问题,是不是调试器出了问题~~~其实那些玩意不是那么容易出错的,先看看你你的A,B函数是不是同一个类的虚函数,如果是,这极有可能... 阅读全文
摘要:
这里的COM组件可以是一个进程内服务器(In-Process Server),也可以是一个进程外服务器(Out-Of-Process Server)。一般情况下,我们在使用这些COM组件的时候,只要保证COM是正确注册了,根本不用关心DLL是怎么被load进来的,或者Exe的进程是被怎么创建的,一切都交给系统提供的COM启动机制,而之中用的最多的就是: STDAPI CoCreateInstance(REFCLSID rclsid,LPUNKNOWN pUnkOuter,DWORD dwClsContext,REFIID riid,LPVOID * ppv);它会帮你找到需要的DLL/Exe, 阅读全文
摘要:
三个关于思考的故事这是三个关于思考的故事,都是最近实实在在发生在我身上的日常小事。 自行车停哪 - 根据常识来推断 这是去慈铭体检的时候发生的事情,当时在楼下转了一圈没找到自行车库。于是问了保安,他手往前一指,其实我也不怎么明白具体在哪里,但觉得顺着他指的方向往前应该能看到吧。但骑了一段后还是没发现,于是回头问了第二次,他手往右前方一指,一看,原来是在右前方的人行道上,还画了白线的。 其实自行车停... 阅读全文
摘要:
perl是一门非常强大的文本处理语言,之前在写perl脚本时,基本上就用Notepad++和print解决了代码编辑和调试的问题。Notepad++作为编辑器其实是一个相当不错的选择了,对perl的代码高亮做得相当漂亮,喜欢的话还能自己扩展;但是对于调试这一块,虽然也用这种土办法写出上千行的能工作的脚本,但老是用print查看结果总不是个办法。 研究了一下,发现两个不错的工具: Komodo ID... 阅读全文
摘要:
在64位系统下,用64位的程序自然是能够充分利用cpu中的64位指令和64位的地址空间,可有的时候,我们却不得不在64位系统下使用32位的程序。64位和32位对于64位还是32位,首先要从概念上把其理清,我觉得这可以分为三个层次: 硬件 主要是指CPU的指令集,寄存器,以及地址空间。比如x64体系结构的CPU,就是在32位的基础上添加了64位的操作指令,寄存器,同时提供了64位的虚拟地址空间。一台... 阅读全文
摘要:
最近在工作中用到了这项registry-free COM技术,也就是免注册COM。我们提供的COM组件,会被多个产品用到,而这多个产品可能: 安装在同一台机子上 使用的COM组件是不同版本的 这样,如果使用普通的注册的COM组件,就会因相互覆盖而产生冲突,轻则功能出错,重则直接崩溃。这就是著名的DLL Hell.什么是Registry-Free COM免注册COM,一般也可以叫做Private A... 阅读全文
摘要:
相信很多人在第一次针对一个字符串资源使用FindResource的时候,都会这么调用:然后基本上你就会发现明明这个字符串是存在的,却就是找不到!是的,系统没问题,编译器没问题,你的眼睛也没有问题。事实上,正确的调用方法应该是:这是由字符串资源特殊的组织方式决定的。字符串和Section让我们先来看一下MSDN中是怎么说的: String resources are stored in sectio... 阅读全文
摘要:
经过一段时间的努力,我的Debugging Now独立博客网站终于有了个自己还算比较满意的雏形,这里记录下一些自己在建站过程中的想法。什么是独立博客独立博客是针对于BSP(Blog Service Provider)网站提供的托管博客而言的。百度百科对其的定义为:独立博客即是在域名、空间、内容上独立自主的博客,它与免费博客相比,更自由、更灵活、更强大、更有价值。可见,独立意味着自主,但也意味着更多... 阅读全文
摘要:
如何快速定位一个函数的返回点,这对于一个比较短小精悍的函数来讲,从来就不是问题,但是假设我们有一个名为LongFunction的1000行长的函数, 调用如下: 在运行中第二行弹出一个assert,我们知道肯定是LongFunction内部运行中出了什么问题导致其返回false。那么它内部出了什么问题,是在哪一行出错导致返回的?这恐怕不是一件容易的事,要知道这是一个1000行的函数,而且极有可能有... 阅读全文
摘要:
这几天工作时碰到一个C++的编译错误(我使用的是Visual C++ 7.0),说是有一个类重复定义,仔细想想我们的这个项目也是做了好几个Release了, 内部代码应该不会有这样的低级错误, 真把类型给重复定义了,检查结果正如我预料的一样。 就这样, 我左右没找到原因,被一个编译错误给卡在那里了。(在我的概念中, 程序错误的等级为:编译错误->链接错误->逻辑错误, 此错误属于最低级... 阅读全文
摘要:
对于C++开发, 我想在Windows下大家用的最多的应该是MS的VC++。但其强大的功能背后却有着"启动速度慢","占用资源多"的缺点,尤其是VS2005, 速度不是一般的慢。 当然,这也十分正常,鱼和熊掌向来是很难兼得。 用这个大家伙开发公司的大项目,用起来自然是得心应手;但对于一般的小程序,就有点"杀鸡用牛刀"的感觉了。 然而, 无论在工作还是平时自己学习中,写个小程序, 通常只要一个cpp... 阅读全文
摘要:
从0~13中任取出7个数,然后判断这7个数中是否存在连续的5个数, 规则如下:1) 7个数可以是重复的数.2) 0可以表示任意数例子如下:0, 1, 4, 3, 8, 0, 13--->true: 1-2-3-4-50, 1, 1, 1, 9, 10, 0--->false0, 1, 3, 9, 10, 11, 12->true: 9-10-11-12-13 0, 0, 0, 0, 0, 0, 0->true: 0-1-2-3-4这是最近看到的一个算法题,粗粗一看,觉得很简单,可是慢慢往里面想,觉得要考虑的还是挺多的。现在把它实现出来放在 阅读全文
摘要:
给出1, 2, 3, 4四个数, 请编程输出其全排列, 如:1 2 3 41 2 4 31 3 2 41 3 4 2...这样的题, 我们在学校的时候一般都遇到过,而我们最先能想到的,应该就是递归实现了,因为这和我们我理解的数学中的排列组合比较一致:先取第一个数,有4种可能,再在剩下的3个数种取出第二个数,这又有3种可能,这样下去直到取到最后一个数。 这样,4个数的全排列就有4*3*2 = 24个。n个数的全排列就是n*(n-1)*(n-2)*...*2*1. 按照这个描述, 我们发现有两点在程序中递归实现时十分重要:1. 哪些数已经取过了而哪些数又是没有取过,可以用的?2. 现在取的是哪一个 阅读全文