分类目录归档:程序相关

C,Python,环境配置等

关于缓存

维基百科中有这样一段描述: 凡是位于速度相差较大的两种硬件之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache。 从最初始的处理器与内存间的Cache开始,都是为了让数据访问的速度适应CPU的处理速度, 其基于的原理是内存中“程序执行与数据访问的局域性行为”。

处理器缓存

在处理器与物理内存间有三级缓存,如下图: 

这是《深入理解计算机系统》上的一张图,对于每一层,位于上层的更快更小的存储设备作为位于下层更大更慢的存储设备的缓存。 从物理内存往上越往处理器方向走,存储设备的成本越高,并且更小,访问的速度更快。 它们是作为存储在更大更慢的存储设备的缓存而存在,它们的作用在于协调处理器与物理内存间的传输数据不一致。 但是把内存单独拉出来说,它也是一种缓存,它的作用也是为了将硬盘或其它较慢存储介质中的数据更快的提供给处理器。

DNS缓存

DNS(域名解析系统)缓存是指当第一次访问某个站点的时候,客户端会向DNS服务器发出解析请求, 然后把信息保存在本机的DNS缓存以备再次访问。启用DNS缓存能提高网络访问速度,相应地,计算机的安全性降低了。

HTTP协议缓存

HTTP为提高性能,减少网络传输的信息量,从而使用了缓存。 HTTP协议缓存的目标是去除许多情况下对于发送请求的的需求和去除许多情况下发送完整请求的需求。 在HTTP协议中使用截止模型和证实模型来实现缓存。 协议它只是协议,只是一种通行的建议和规范,关键还是看客户端的实现。 比较直观的体现是:当第一次去一个网站时加载会比较慢,但再次打开这个网站时速度会快很多。 这是由于基于HTTP协议,浏览器客户端将一些CSS,图片等文件都缓存在本地,从而不再需要从服务器读取。

DNS缓存、HTTP协议缓存的作用与处理器缓存有一些不同,虽然也是协调数据传输速度的差异,但是其本质的差别是它已不再是纯粹的两种硬件之间的差异, 而是引入了网络的元素,换一种表示方式:凡是位于速度相差较大的两种实体之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache。

数据库系统缓存

这里没有用数据库缓存是因为数据库与数据库系统在概念上不是一回事。数据库是“按照数据结构来组织、存储和管理数据的仓库”。 而数据库系统是一个实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质、处理对象和管理系统的集合体。 我们平时所说的数据库缓存是数据库系统所提供的缓存功能。

以MySQL为例,我们使用最多的是查询缓存(Query Cache)。 它的实现过程不是很复杂,当客户端请求了一个查询后,MySQL通过特定的Hash算法生成一个标识用的hash值, 得MySQL计算完后,返回的结果集将与这个生成的hash值对应存放在内存中。若此缓存没有过期时, 下一次相同的请求过来时将直接返回结果,不再需要SQL解析,计算等操作。

PHP内存管理中的缓存

PHP内存管理中的缓存也是基于“程序执行与数据访问的局域性行为”的原理。 引入缓存,就是为了减少小块内存块的查询次数,为最近访问的数据提供更快的访问方式。 其实现过程主要包括以下的一些活动:

  • 标识缓存和缓存的大小限制,即何时使用缓存,在某些情况下可以以最少的修改禁用掉缓存
  • 缓存的存储结构,即缓存的存放位置、结构和存放的逻辑
  • 初始化缓存
  • 获取缓存中内容
  • 写入缓存
  • 释放缓存或者清空缓存列表

文件缓存

此处的文件缓存是指在应用开发过程中将一些中间结果存放在文件,以备下次使用。 如在PHP中一些模板系统的实现,以其规则编写了模板文件,生成中间的PHP文件,如果用户调用某个页面则直接访问PHP页面,而跳过了模板的解析过程

以上三种缓存与前面也不一样,它实际上是将一些需要计算后的结果缓存,下次直接返回计算后的结果。依此,则缓存的表述可以再次修改为: 凡是获取数据速度相差较大的两种实体之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache。

关于编码规范

当提到编码规范,自然而然就会想到约束,没错,编程规范本来就会约束开发人员的编码风格。 但是约束并不是所期望的最终目的,约束只是一种表现形式,关键在于建立编码过程中的一种秩序, 以及团队编码风格的统一和稳定,从而提高编码质量,进而提高产品的质量。

当下的我们处于一个需要团队协同作战的世界,一个项目可能需要几个人、十几个人或几十几百人的技术团队,而在产品的生命周期中可能会经历多个项目, 在此期间,人来人往,人走人留,当新来的团队成员在读他的前任留下的代码时,如果团队内部没有一个统一的规范,可能会出现一系列的问题。如: 不知道变量名的意思,莫名其妙的函数定义,搞不清的类实现等等。这些问题会让新来的成员相当纠结难过, 从而给他们一种挫败感,他们熟悉项目代码的时间就会比较长,比较辛苦。 这只是没有编码规范所带来的一个比较显著的问题而已。

每个公司,每个团队都有其文档化或潜规则的编码规范,这里我们不谈具体的规范,只谈“风月”。 我们认同在编码过程中应该遵循的两条原则:

  1. 代码不仅仅是写给计算机看的,更重要的是是写给人看的。
  2. 注意破窗户,细节决定成败。

写给计算机看的代码往往追求的是运行结果的正确和满足需求的执行效率。这样的代码可能是乱糟糟的,没有注释,没有空格,没有排版,没有可以理解命名…. 除了刚写完的那会儿,我们知道我们所写的代码是啥意思。当过了十天半个月回来可能就连自己也不知道当初那会儿是怎么想的了, 更不用说如果这样的代码移交到其它同事,他那张纠结的小脸了…

代码到最后都是写给人看的,首先是给自己看的,然后是给使用这段程序的人,最后是其他与这段代码现在或将来相关的人。 这里所谓相关的人包括:

  • 可能会阅读这段代码的人
  • 可能会修改这段代码的人
  • 可能会下载/复制这段代码的人
  • 可能会走读这段代码的人
  • 测试人员
  • ……

从这个点出发,我们才能理解为什么要有编码规范,为什么会有若干文档。 我们所做的这些都是为将来做的,所谓“前人栽树,后人乘凉”,大致就是这个意思。

《程序员修炼之道》有这样一条:不要容忍破窗户(Don’t Live with Broken Windows)。 当我们遇到“破窗户”: 如低劣的设计、错误决策、或糟糕的代码,要及时的处理,如果不能马上修改代码,也请在有问题的地方写上注释,说明问题。 因为一旦有了第一个破窗户,不久后就会有第二个,第三个……直到整个系统满目疮痍、崩溃。 这里的“破窗户”可以理解为一些细节的问题,虽然我们经常会听到“细节决定失败”,在现实中也确实有些因为细节而成功的案例。 但是细节并不是每个人都可以看到的,有些人对于一些有问题的细节可以视而不见,这不是因为他们不想去改, 而是他们根本就不知道这些细节是不是正确的,感知细节也是一种能力,这需要在实践中不断的学习,不断的思想,不断的阅读好的代码,最好还有此中高手的指导。 这些细节决定了我们代码的成败,虽然结果不是马上显现的。

回到我们所用的语言-PHP,在编码规范这块,PHP本身就有一些问题,如函数的命名,PHP既有使用骆驼命名法的,也有类似于C中的以下划线隔开。 但是这种不规范中也有它的规范,所有的函数的命名都是以下划线隔开,所有的PHP提供的类中的方法都是骆驼命名法。 PHP以一种包容和开放的心态来处世,但是是否失去了自己特色呢?虽然PHP的有一些语言特点与一些商业的运作有关, 但是应该有自己的坚持,应该建立属于自己的规则。

TIPI儿童节版发布

少年智则国智,少年富则国富,少年强则国强,少年独立则国独立,少年自由则国自由,少年进步则国进步……

各位自认为是儿童的,不是儿童的;扮萌的或已成为大叔的同学,儿童节快乐! TIPI团队选择在这个应该纯粹一点的节日里,发布努力了两个月的成果。 自最近一次的版本发布(2011-04-01)以来,关注的同学可能会注意到网站上 没有新的变化,其实这段时间我们并没有减缓TIPI项目的进度,在第一次项目发布之后我们收到了很多的反馈, 经过团队的讨论,我们决定暂缓新章节的编写,把精力集中在现有章节的改良上。 总体来讲有如下变化:

  • 重构现有章节。将现有一些章节的内容进行了丰富。当然这并不是终点,我们会持续对内容进行优化。
  • 完成了第五章的编写。上次发布时发布了第五章类的第一二小节,这次我们完成了所有的内容。

上次发布时我们提供了PDF版本的下载, 这次的发布没有带来新格式的下载,不过不要着急, CHM版本的下载将会在近期提供。

TIPI入口>>>