代码调优法则–编程珠玑笔记


1、空间换时间法则 这个东西,稍微有点程序经验的人应该都接触过,比如在设计数据时候冗余了部分数据,避免关联表查询,减少开销,实际上也减少了查询时间,所谓空间换时间。还比如,我们将一个有点开销的计算结果存储起来,避免下次再次运算,减少时间消耗,再如,CPU的设计,设置了高速缓存,一级缓存,二级缓存,主存(通常所说的内存),其实一个硬盘和一个CPU也可以干活,只是干得不怎么样,因为硬盘和CPU之间速度实在是差别太大了,如是就有人想把可能要用到的数据预先加载到高速缓存或者主存中,慢慢形成了今天的个人计算机架构。 2、以时间换空间法则 这个其实也是天天在用的一个法则,只是一般技术人员看到“压缩”二字的时候,没联想到那么多,压缩就是最典型的拿时间换空间的例子,就是不断的重复前面已经存储过的存储地址,用来避免存取真实的数据。 3、循环法则 大部分稍微有点经验的人不会在同一个函数中循环两次同样的变量,但是仅限于同一个函数,假如在一个函数里调用了另外一个函数,那么就不一定了,很多人为了看似解耦的一个操作,在两个函数对同一个变量做了多次的循环。循环法则有几个比较经典细则: 第一、将代码移除循环,这是最容易想到的,当然,可以移除的条件是,每次循环都执行同样的某次操作。 第二、合并测试条件,高效的内循环应该包含尽量少的测试条件,最好只有一个,因此,程序员尽量用一些退出条件来模拟循环的其他退出条件。 第三、哨兵法则,在数据结构边界上放一个哨兵以减少测试是否已经搜索结束的开销。 第四、展开循环,展开循环可以减少修改循环下标的开销,对于避免管道延迟,减少分支以及增加指令级的并行性也有很大帮助。 第五、删除赋值,赋值的开销实际上在整个程序的执行过程中占的开销可以忽略不计,但假如你要在一个循环十万次的循环中赋值,那么开销就不能不计了,尽可能的在循环中减少赋值吧。 第六,消除无条件分支,快速的循环中不应该包含无条件分支,通过旋转循环,在底部加上一个条件分支,能够消除循环结束处的无条件分支。 第七、循环合并,如果你不小心做了傻事,那么合并两个对同一个变量循环操作吧 4、逻辑法则 利用等价的代数表达式。如果逻辑表达式的求值开销太大就将其替换为开销较小的等价代数表达式。 短路单调函数。如果我们想测试几个变量的单调非递减函数是否超过了某个特定的阈值,那么一旦达到这个阈值就不在需要计算任何变量了。 对测试机条件重新排序。在组织逻辑测试的时候,应该是降低开销的,经常成功的测试放在高开销的,很少成功的测试前面。 5、过程法则 打破函数层次。对于(非递归地)调用自身的函数,通常可以通过将其改写为内联版本并固定传入的变量来缩短其运行时间。 并行性。在底层硬件条件下,我们构建的程序应该尽可能多的挖掘并行性。 6、表达式法则 编译时初始化。在程序执行前,应该尽可能多的变量初始化。 利用等价的代数表达式。如果表达式的求值开销过大,就将其替换为开销更小的等价的代数表达式,比如换一种算法 消除公共子表达式。如果两次对同一个表达式求值,其所有变量都没有任何改动,那么我们可以用下面方法避免二次求值:存储第一次的计算结果并用其取代第二次求值。

UDP hole punching 翻译


3.3. UDP hole punching  UDP打洞技术 The third technique, and the one of primary interest in this document, is widely known as “UDP Hole Punching.” UDP hole punching relies on the properties of common firewalls and cone NATs to allow appropriately designed peer-to-peer applications to “punch holes” through the middlebox and establish direct connectivity with each other, [...]

Firefox使用SSH配合autoproxy自动翻山图文教程


在这个特殊的日子里,我没有什么可以做的,在西厢计划没有成型之前,希望此文能够让翻山的人少折腾,少排出一点二氧化碳。 每个人都抱着“我们不能改变什么,那是别人玩的游戏”,我们的未来还有希望吗。围观也是一种态度,起码我们有勇气去寻求真相。也许我们不能改变什么,但是我们应该为那些有勇气的人鼓掌。 Google走了,周围有人说:因为他们没有遵守中国的法律。其实是你自己被剥夺了寻求真相的权利,而他在帮你把它争取回来,而你依然是一名不明真相的群众。 这篇文章将介绍另一种翻山手段,SSH代理山墙,对于购买类似Dreamhost主机的用户,会有SSH帐号可以使用,通过这个SSH帐号,即可实现更为安全可靠并且稳定的翻山术。 名词解释:SSH 安全外壳协议(Secure Shell Protocol / SSH)是一种在不安全网络上提供安全远程登录及其它安全网络服务的协议。最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。 常用的SSH工具有开源软件putty,后面介绍的MyEntunnel最终还是靠pLink调用putty实现SSH的加密通道。 第一步:获取拥有SSH权限的帐号和密码。 对于购买类似Dreamhost主机的用户,会有SSH帐号可以使用,也可以通过其他方式购买或者获取SSH帐号。 友情提示:没有SSH帐号的朋友可以去淘宝、有啊,拍拍等网站自行搜索,并购买,目前报价普遍10元左右每月 第二步:配置MyEntunnel软件 下载并安装MyEntunnel,该软件全名为My Encrypted Tunnel。 按照上图将第一步收到的帐号信息填写到相应的地方后,点击 “保存”按钮,再点击“连接”按钮。 第一次连接过程中会出现一个认证对话框,按照提示选“yes”即可。以后的自动连接中将不再出现此认证对话框。 最后点击“隐藏”按钮,使对话框隐藏到右下角系统任务栏中。 提示: 为MyEntunnel创建一个快捷方式,将其复制到系统的【启动】(C:\Documents and Settings\当前用户名(需要修改成你自己的)\「开始」菜单\程序\启动)文件夹中,今后开机便可自动启动软件,并自动连接服务器。 如上图所示,myentunnel有三种颜色表示不同的状态,绿色代表连接成功且稳定;黄色代表正在连接或重新连接;红色代表连接失败。 第三步:配置Firefox浏览器 Firefox有一个扩展,叫做AutoProxy,它能够自动配置让被墙的站点通过代理服务器访问。你可以通过firefox访问以下地址安装:https://addons.mozilla.org/zh-CN/firefox/addon/11009 如下图所示,点击添加到Firefox。 点击 “立即安装” 安装完成后按照提示重新启动firefox以便配置 autoproxy。 重启后完成autoproxy的安装,我们在弹出的窗口中开始配置autoproxy,如下图: 在“代理规则”中“添加规则订阅” 如下图选中“gfwList”,然后点击右下角“订阅”按钮。 在“代理服务器”选项卡中,选中“选择代理服务器” 然后按照下图标示选择并确定。 如下图所示,在“选项” 标签中选择“自动模式” 最后,单击下方的“应用”并“确定”,到此设置完毕。 今后只要先启动MyEntunnel,然后启动Firefox就可以自动翻墙了,而不需要使用代理的站点依然是直接访问(不通过代理),所以速度不受影响。 最后测试一下,访问一下facebook吧: 好了,完全正常。 Update: 看了国新办网络局就谷歌搜索退出中国内地发表谈话 很受伤,引用锅巴的一句话,傻逼是永远死不光的,正如我本文开头所说的那样,自己不知道争取自由,别人帮你争取,那个人却成了坏人

代码格式规范的List


《代码大全》是本好书啊,推荐所有有志于改善自己的程序,或者在编码上寻找进一步提高的人应该仔细研究研究。以下是摘抄自《代码大全》第二版中谈到关于怎样的代码格式更适合人类阅读,更能令人愉悦的Check List。对照List进行自检和反省,令人欣慰的是List中80%以上我都做到了,在我的上一个项目中做得比较失败,由于时间的原因,很多注释没有加上,逻辑也不够清晰。在重构中解决,借此反省。 一般问题: 格式化主要是为了展现代码的逻辑结构吗? 2、你的布局方案能统一运行吗? 3、 你的布局方案能让代码易于维护吗? 4、你的布局方案是否有利于代码的可读性? 控制结构的布局 1、你的代码中避免begin-end 或对{}的双重缩进了吗? 2、相邻的块之间用空行分割了吗? 3、对复杂表达式格式化时考虑到可读性吗? 4、对只有一条语句的块布局始终如一吗? 5、case语句与其他控制结构的格式化保持一致了吗? 6、对goto语句格式化是否让其显眼了呢? 还好目前PHP只有5.3以上版本才会有goto 单条语句的布局: 1、为逻辑表达式、数组下标和子程序参数的可读性使用了空格了吗? 2、不完整的语句在行末似乎以明显又错的方式结束吗? 3、后续行按照标准数码缩进了吗? 4、每行顶多只有一条语句吗? 这一点是团队中比较头痛的问题,很多人不按照这个规则来做,结果它成了一种风气 5、所写的每个语句都没有副作用吗? 6、每行顶多只声明一个数据吗? 注释布局: 1、注释与其所注释的代码所尽量相同吗? 2、注释风格便于维护吗? 子程序的布局: 1、你对每个子程序的参数格式化方式便于看懂、修改、注释吗? 2、采用空行分割子程序各部分了吗? 4、文件中子程序用空行清楚分开了吗? 5、在没有更好的组织形式的场合,所有子程序都按字母排列了吗? 这一点我没有做到,没有做到是没有想到这一点,以后编码注意了……

上海Think In Lamp 聚会记


关于创业 1、创业不是因为钱多,而是在现在的岗位上可能遇到天花板或者因为兴趣 2、25岁还没创业,那么只能等到35岁了,主要理由是,年轻的冲劲没了,就只能等到真正稳定下来才能去创业,当然前面的年龄只是个描述,并不是严格的界限,只是为了说明在年轻的几年中,有一段时间出去创业的几率很小,而且成本很高 3、盯住小众而高端的市场并一定比大众的市场来钱少,反而更容易做口碑。 4、目前的体制下,政府或者国企的钱最好赚 5、中国穷人多,富人也多,有人愿意出钱玩玩 6、不做培育市场的事情,创业之前做好在中国这个山寨文化很浓的国家被人模仿和抄袭的准备 7、创业是很痛苦的,也是走向更高层次的最好机会之一 关于职业发展: 1、在一个公司的发展是有限的,盯着那个位置不一定能坐到,跳槽或许是捷径 2、薪水是影响选择职位的一个因素,但不是最重要的元素,开心和有成就感更能留住一个人。 3、跳出IT圈子,IT不过是一个工具,不管是电子商务,还是内容提供,娱乐提供等,最需要工具的并不是互联网,而是传统行业,做传统行业更能带来效益和收获。 4、国内的企业和国外的企业还是有很大差距的,不仅仅是薪水,最重要的职业发展方面,国外的企业很舍得花钱在IT方面,来提高生产效率,会为员工提供更多的培训机会和学习机会,甚至有强制学习制度保证员工不断进步和提升 5、站在传统行业看互联网行业的一些技术工作从事者,很多纯粹似乎自虐,大部分企业系统根本不需要承受千万PV,根本不需要负载均衡,根本不需要浏览器兼容,什么也不需要,他们只要能用就行,能快速解决问题、能带来效率提升的就是最好的。 6、每个人的职业都有天花板,或许出去创业一下,更能知道自己想要什么 7、创业不成功者去面试一个更高层次的岗位时,往往能得到更多的信赖和机会