IT技术讨论
莫失莫忘
这个作者很懒,什么都没留下…
展开
-
编程匠艺(一)善于防守——健壮代码的防御性编程技巧
防御性编程:顾名思义,防御性编程是一种细致的,谨慎的编程方法。为了开发可靠的软件产品,我们要谨慎地设计系统的每个细节,便是其能尽可能的“保护”自己,,我们通过明确的代码中增加很多的假设,当假设在现实的客户环境中执行时才不至于崩溃,给一些客户莫名奇妙的错误或者异常。防御性编程是一种防卫方式,而不是一种补救方式。转载 2011-10-24 20:47:27 · 288 阅读 · 0 评论 -
编程匠艺(二)精心布局
编码的风格曾经是、现在是、将来也将继续是程序员之间信仰之争的主题之一。编程样式极大的影响了代码的可读性,没有人愿意使用读不懂的代码。我们的代码一般有3类读者:1. 我们自己,我们不仅需要能够读懂刚刚写下的代码,也需要在多年之后仍然能够明白它的意思;2. 编译器,关注语法,不关注样式;3. 其他人,这类人最重要,也最容易被忽视。什么是好的样式?1. 一致(Consistent原创 2011-10-25 20:56:20 · 241 阅读 · 0 评论 -
《代码优化:有效使用内存》读书笔记 (一)
时间就是金钱,效率就是生命。这句名言对于程序,尤其是性能至关重要的程序来说,同样一点都不过分。如何获得良好的程序运行性能,就是代码优化的研究内容。 本人之前主要从事计算机视觉,图形学以及图像处理相关方面的研究工作,现在更侧重于算法的开发和实现,并用于产品之中,部分算法需要在移动设备上运行,因此对内存使用效率和运行速度要求非常高,基于此,目前在读《代码优化:有效使用内存》这部书。并原创 2011-10-25 20:59:46 · 711 阅读 · 0 评论 -
《代码优化:有效使用内存》读书笔记(二)——优化技巧之展开循环
从本节开始,我将与大家分享本书中介绍的内存优化操作方法,集中讨论大型内存块的优化与内存密集型流处理算法。在很多程序中,密集内存访问是不可避免的,以我经常做的图像处理程序为例,我们会经常性地遍历图片,也就是频繁密集地访问内存,而不管存储器吞吐量的增长多么可观,以及存取时间是如何急剧下降,RAM总是限制系统总体性能的瓶颈之一。一般数据处理算法很少用到RAM性能的三分之一,算法的性能常远远低于这个水原创 2011-10-26 19:06:08 · 571 阅读 · 0 评论 -
《代码优化:有效使用内存》读书笔记(二)——优化技巧之消除数据相关性
如果请求的RAM单元存在地址-数据相关性(也就是说,一个单元含有另一个单元的地址),那么CPU不能并行地处理他们,而在得到地址之前必须等待。以while(next=p[next])为例来考虑这种情况。在处理器得到next变量值之前,它不会知道下一个单元的地址而不能开始加载它。这样一个循环的执行时间主要由内存子系统的延时决定,而与它的吞吐量很少有关。 与之相对的是while(a=p[n原创 2011-10-28 21:02:02 · 521 阅读 · 0 评论 -
编程匠艺(三)名正言顺
远古的人认为命名某个事物就是对其拥有权利。这不仅仅是简单的宣称所有权。一些人对名字的力量坚信不疑,以至于他们从不将自己的名字告诉陌生人,因为他们害怕陌生人会使用名字来伤害他。名字所描述的内容包括:1. 身份;2. 行为;3. 识别,名字将一个事物标明为一个性质独特的实体。我们为什么应当恰当的命名呢?因为编写源代码就是关于如何进行清晰的交流,恰当的命名意味着“了解名称就可以了解对象”。清转载 2011-10-30 19:01:52 · 265 阅读 · 0 评论 -
《代码优化:有效使用内存》读书笔记(三)——优化技巧之数据并行处理
从上一篇可以看出,处理无关数据比相关数据快得多。但是到底能有多快呢?在大多数情况下,并发读取两个相邻单元的企图会向内存子系统发出一个请求(而不是想象中的两个)。字节并不是与存储器进行数据交换的基本单位,整个数据包才是基本的交换单位。根据处理器类型不同,这种包的长度取值从32字节到128字节不等。可见,线性读取无关数据并不能确保对该内容进行并行处理。我们举一个简单的例子,有以下代码:原创 2011-10-29 13:54:48 · 455 阅读 · 0 评论