博文

目前显示的是 四月, 2013的博文

关于缓存(上)

    Han 通过 Google 阅读器发送给您的内容:     关于缓存(上) 于 13-4-24 通过 搜索技术博客-淘宝 作者:liaoran 缓存概述 商业世界中常说的一句话是"现金为王"。在技术世界里,与之相近的一个说法是"缓存为王"。 缓存在构建高性能web站点中有着举足轻重的作用, sql优化, 算法优化所带来的效果可能远远不如缓存带来的优化效果。但是缓存的使用并不是零成本的,首先的一个问题是,任何缓存的增加,都会带来两大问题: 数据不一致。 系统复杂度大幅度增加。 解决这两个问题需要以下一些方法,首先是去掉缓存。不要为了用缓存而用缓存,缓存不必要时,应该果断去掉,从而降低系统出错的可能性,降低系统复杂度。有些对数据实时性,准确性要求极高的系统,不能使用缓存。其次是分析需求,不同的业务会有不同的缓存策略,仔细分析变化与不变的数据,将不变的数据长时间缓存,变化的数据根据数据的业务意义和实时性要求动态调整缓存时间和存储方式。最后就是增加开发人员自身的能力,后面会详细提及各种问题的处理方法。 关于缓存的设计其实也脱离不了计算机基本的设计思想。数据结构与算法是计算机软件设计永恒的主题,算法的优劣需要考虑算法的时间和空间复杂度。多数优秀的算法都采用空间换时间的方式。涉及到缓存也不例外,缓存的设计需要考虑缓存的占用空间和命中率。我们当然希望缓存占用空间小,命中率高。命中率高是缓存设计的重要考察因素, 是提高系统性能的关键。占用空间越小,需要的成本越低。低成本,高效能的缓存设计是我们追求的目标。这没有固定的设计方法和公式,需要根据不同的业务灵活调整,但是,关于缓存在业务开发中的设计方法,有一些比较常用的思路与模式,借鉴这些模式,我们可以复用或创新,解决新的业务中所出现的问题,下面我就简单总结一些常用的缓存设计方法和应用场景,抛砖引玉,希望能对以后的开发有所帮助。 缓存不可变对象的复杂计算 第一个简单的缓存方式叫做缓存不可变对象的复...

google group varint 无损压缩解压算法的高效实现 改进版

    Han 通过 Google 阅读器发送给您的内容:     google group varint 无损压缩解压算法的高效实现 改进版 于 13-4-17 通过 搜索技术博客-淘宝 作者:野王 之前实现了一个版本: google group varint 无损压缩解压算法的高效实现 近期对其进行了一次改进,性能提升 20%,测试数据如下: 压缩和解压 100万个整数 (4M) 新版本: encode time consumed: 0.003252 s ; decode time consumed: 0.003769 s 老版本: encode time consumed: 0.005198 s ; decode time consumed: 0.004909 s 这样 1秒钟 能解压 1G 的数据,够惊人的吧 不废话,上代码, 有兴趣的自己看,如果我的注释不够清晰,请联系我修改 /****************************************************************** * Created on: 2011-4-26 * Author: yewang@taobao.com clm971910@gmail.com * * Desc : 提供uint32的 varint 压缩和解压功能 * 提供group varint的高效实现 * ******************************************************************/ #ifndef VARI...

Lua 5.2.2 中的一处 Bug

    Han 通过 Google 阅读器发送给您的内容:     Lua 5.2.2 中的一处 Bug 于 13-4-18 通过 云风的 BLOG 作者:云风 前几天, Lua 5.2.2 发布了, 主要是修复了 4 个 Lua 5.2.1 中已知的 bug . 其中包括前段时间一个同学和我在 email 交流中讨论的一个问题. 我把 Lua 5.2.2 更新到公司项目的主干上,同时需要对我的那本 《 Lua 源码欣赏 》做一些更新,需要把这次的代码更改同步到书里去。这个工作很繁琐,但有它的价值。比如我发现了 Lua 5.2.2 比 5.2.1 的更改远不只官方宣布了 4 处 bugfix ,还有一些小调整,让 Lua 的源码更规整一些。 阿楠同学因为这段时间一直在维护 UniLua 这个 C# 版的 Lua 项目,我就随便和他通告了一下这次的一些代码变更,方便他同步到 UniLua 项目中去。 讨论之中,他提到 luaD_precall 函数的实现有些诡异之处,没有看明白。我顺着他指出的位置又仔细阅读了一下,果然发现这里存在一个隐藏很深的 Bug 。 准确说,这不是 Lua 5.2 引入的新 Bug , 至少在 Lua 5.1 年代就存在了。只不过很难触碰到触发条件。 理解了代码后,我构造了一小段 Lua 代码,可以让 Bug 暴露出来。 function f(p1,p2,p3,p4,p5,p6,p7,p8,p9,...) local a1,a2,a3,a4,a5,a6,a7 local a8,a9,a10,a11,a12,a13,a14 end f() 运行这段 Lua 代码会让 Lua 虚拟机崩溃。我的修复 patch 如下: diff --git a/src/ldo.c b/src/ldo.c index aafa3dc..a901e6c 100644 --- a/src/ldo.c +++ b/src/ldo.c @@ -324,7 +324,7 @@ int luaD_...

为什么你写不好一个快速排序? 谈程序员的职业发展

    Han 通过 Google 阅读器发送给您的内容:     为什么你写不好一个快速排序? 谈程序员的职业发展 于 13-4-10 通过 A programmer's life 我常常在想,当初我若不离开完美,现在肯定也是总监级的title了,收入比现在高一倍不止。但是另一方面,在编码能力上我甚至不如某些刚毕业的本科生。比如,快速排序的算法我很熟悉,就一句话:"随机选一个元素,用它把输入集分成两半,对这两半继续递归,然后将递归得到(已排好序)的结果合并"。但几个月前看算法书的时候自己尝试写了一下快速排序,发现远远是另外一回事。虽然我对这个算法很清楚,但是用C++实现的时候充满了疑惑,写出来的代码BUG很多,调了很久才调对。相反,如果拿这个做面试题去面应届生,我相信对北大清华的学生通过率应该很高,至少过半。那么我比他们多了6-7年的工作经验,这些经验又是什么呢? 工作经验是人生最容易积攒的财富,只增不减。钱和不动资产,差不多也是如此。所以要想向年轻人炫耀成功项目,牛B的经历,是很容易的事情。在一个很好的平台上,与聪明的人共事,顺水推舟,再加上运气不是太差的话,工作3-5年后,必然会有一个值得吹嘘的项目。比如我就老喜欢说我第一次做游戏就带着人做了梦诛,在线多少万多少万,等等。 但是呢,对一个程序员来说,最核心的价值是什么?是快速的把想法,变成无bug的正确代码的能力。像前面提到的快速排序,如果需求已经很明确,怎么实现已经很清楚, 语言你自己选, 工具你随便挑。20分钟内代码写不出来,写不对,那就自己的问题,水平差。 我之前走了一条弯路,听信软件工程的人说,不要重复造轮子。于是就忽视了这些基础训练。" 不要重复造轮子"这句话在公司里是对的,但是在下班后,或是在学校,在自己写代码练手的时候,就绝对是错的。重写那些经典的算法,是绝佳的思维练习。写二分查找的时候,需要根据区间的长度是奇数还是偶数,判断结...

死锁检测模块lockdep简介

    Han 通过 Google 阅读器发送给您的内容:     死锁检测模块lockdep简介 于 13-4-10 通过 Lenky个人站点 作者:lenky 在Linux系统里,假设有两处代码(比如不同线程的两个函数F1和F2)都要获取两个锁(分别为L1和L2),如果F1持有L1后再去获取L2,而此时恰好由F2持有L2且它也正在尝试获取L1,那么此时就是处于死锁的状态,这是一个最简单的死锁例子,也即所谓的AB-BA死锁。 死锁导致的最终结果无需多说,关于如何避免死锁在教科书上也有提到(参考1),最简单直观的做法就是按顺序上锁,以破坏死锁的环形等待条件。但对于拥有成千上万个锁的整个系统来说,完全定义它们之间的顺序是非常困难的,所以一种更可行的办法就是尽量提前发现这其中潜在的死锁风险,而不是等到最后真正出现死锁时给用户带来切实的困惑。 已有很多工具用于发现可能的死锁风险,而本文介绍的调试/检测模块 lockdep ,即是属于这一类工具的一种。调试模块lockdep从2006年( https://lwn.net/Articles/185666/ )引入内核,经过实践验证,其对提前发现死锁起到了巨大的效果( http://lwn.net/Articles/321670/ )。 官方文档(完全参考2)有介绍调试模块lockdep的设计原理,这里按照我自己的理解描述一下。 一,lockdep操作的基本单元并非单个的锁实例,而是锁类(lock-class)。比如,struct inode结构体中的自旋锁i_lock字段就代表了这一类锁,而具体每个inode节点的锁只是该类锁中的一个实例。对所有这些实例,lockdep会把它们当作一个整体做处理,即把判断粒度放大,否则对可能有成千上万个的实例进行逐一判断,那处理难度可想而知,而且也没有必要。当然,在具体的处理中,可能会记录某些特性情况下的实例的部分相关信息,以便提供事后问题排查(没看具体源码,属个人猜测,:))。 二,lockdep跟踪每个锁类的自身状态,也...

性能优化tips(一)

图片
    Han 通过 Google 阅读器发送给您的内容:     性能优化tips(一) 于 13-4-7 通过 搜索技术博客-淘宝 作者:悟时 (1)数据对齐是否更快? 从学习数据结构的第一天起,书上就告诉我们,数据对齐可以使得访问速度更快,我心里也一直有这样一个印象,但是对其具体原因,一直不太清楚。借着最近TreeLink大赛之后大家对于性能优化痴迷的机会,我也来细细研究下这个问题。 首先来看下面这段代码: #include #include "time.h" #define OP | using namespace std; using namespace ups_util; #pragma pack(push) #pragma pack (1) struct NotAlignedStruct { char a; char b; char c; uint32_t d; }; #pragma pack (pop) struct AlignedStruct { char a; char b; char c; uint32_t d; }; struct FirstStruct { char a; char b; char c; }; struct SecondStruct { char a; uint64_t b; uint32_t c; uint32_t d; }; struct ThirdStruct { char a; uint32_t b; uint64_t c; }; void case_one( NotAlignedStruct * ar...

沧海横流方显英雄本色,大疫来时足见中医真容

图片
    Han 通过 Google 阅读器发送给您的内容:     沧海横流方显英雄本色,大疫来时足见中医真容 于 13-4-7 通过 科学松鼠会 作者:李清晨 本文作者:李清晨 禽流感来袭,截止到2013年4月5日为止,全国确诊共有16例H7N9禽流感病例,已有6人死亡,如此高的病死率未免让人心下骇然,不过好在到目前为止,尚无证据表明接触者之间或确诊病例之间有人到人的传播,否则不止是中国,恐怕就连人类世界都将陷入恐慌。世界卫生组织中国代表处,在4月3日发布了 《人感染甲型H7N9禽流感常见问题回答》 ,这个问答其实已经将民众最关心也是最关键的部分说的非常清楚了,但部分地方政府也许是不肯鹦鹉学舌,在发布了中华人民共和国国家卫生和计划生育委员会关于印发 《人感染H7N9禽流感诊疗方案(2013年第1版)》 的通知而外,又附加了人感染H7N9禽流感中医药预防方案,这些方案一经发布就遭到了大部分职业医生(甚至包括部分中医师在内)和科普爱好者的质疑,而"超级无敌万能神药大力丸"板蓝根则再次被推上了前台,昨天一广东记者打电话采访我时告知,他走了几家药店,板蓝根已经卖断货了,对于板蓝根的再次华丽登场,就连一向与"主流"保持高度一致的官方媒体 @央视新闻 也在新浪微博上表达了质疑 ,提出除安慰剂效应而外, 板蓝根未被证实有疗效,其副作用却不可忽视… … 那么,为什么会有这么多人质疑中医在传染病防治方面的作用呢?历史上,中医在传染病防治方面究竟战绩如何?我们不妨看几个例子,看看所谓博大精深的中医在人类与传染病斗争的历史上,到底扮演过一个什么样的角色。 先说疟疾,疟疾是由疟原虫导致的周期性发作的疾病,其典型的临床表现是,先出现寒战,然后发生发热,大量出汗后退热,故在中国也被称为...

Google广告人:低调的Neal Mohan,高调的1亿薪酬

图片
    Han 通过 Google 阅读器发送给您的内容:     Google广告人:低调的Neal Mohan,高调的1亿薪酬 于 13-4-7 通过 36氪 | 关注互联网创业 作者:liao717921@gmail.com (yuanlingliao) 导语:Neal Mohan,当Twitter困于内部之乱,急需人才收拾残局,力争几十亿广告份额填补亏空之时,CEO Dick Costolo首先想到的是他。而当Google为自身广告业务极力挽留他时,开出的交换条件则是超过1亿美元的股票。令篮球明星安东尼的年薪都黯然失色的Mohan,在广告业务上究竟有何建树? 年轻人的好奇心 起初,Mohan拿着六万美元的年薪为创业公司NetGravity工作。他在LinkedIn上描述自己为"高级分析师",事实上他最多只算高级客服代表。但他的老板 Richard Frankel并不以此为意, Frankel更看重的是Mohan对互联网技术的深刻理解,这在1990年代还是稀缺资源。 更为难得的是,Mohan可以将对技术天然的热爱,转换为商业价值。"当他和顾客交流时,他不仅仅为他们解决燃眉之急",Frankel说道,"Mohan会帮助他的顾客理解NetGravity产品的原理,让顾客能更好地利用这一工具。这无形中为公司博得更多企业的青睐。" 那时,Frankel就意识到Mohan身上的成功潜质——他不仅拥有联结科技与商业的天分,还有强烈的好奇心。 "在会议上不停发问就是他的风格。你能感受到他在极力理解大家讨论的问题:有哪些新的部门,哪些新的公司,出现了什么客服问题。他总能在观点碰撞之中收获不少启发,并内化于自身的知识体系中。" 500页的PPT 后来,NetGravity被DoubleClick收购,而后DoubleClick又因经营不善被Goo...

加州求职记

图片
    Han 通过 Google 阅读器发送给您的内容:     加州求职记 于 13-4-4 通过 :wq ~/notes 作者:连城 (Lian, Cheng) 一年多前,出于显而易见的原因,下定决心肉身翻墙。经过一番考虑,放弃了读书这条途径,决定直接找工作,通过H1B签证出去。于是去年八月份从百度辞职,开始着手准备。当时觉得今年拿到H1B的成功率大致能有个六七成,加上周围朋友们的不断鼓励,可以说还是相当自信的。然而,时至今日,在历经Google、Amazon、Facebook三家公司之后,这第一次尝试却可耻地失败了…… 战绩概览: Google:仓促应战,HR电面一轮,技术电面一轮,北京onsite两轮,惨败; Amazon:技术电面两轮,在面试官反馈良好的情况下莫名挂掉,详情见下; Facebook:HR电面一轮,技术电面两轮,Menlo Park总部onsite五轮,惜败; AeroFS:因为是startup,临时告知无法提供H1B,于是告终。 个人背景参见 这里 。 失败的原因,简而言之就是两个字——自大。在百度四年多,技术方面长进不少;虽然从未以做管理为目标,却也阴差阳错地干了两年管理,从零带出了一支二十多人的研发队伍,同样获益颇丰。再加上离职时恰逢耗时一年之久的首部译作正式出版,自我感觉良好,信心爆棚。周围的朋友和同事们听说了我的计划之后都鼓励说"肯定可以",于是我也就飘飘然地认为"肯定可以"了。这种自大心理使得我没有尽早将目标公司的面试方式研究透彻,并及时采取最为有效的方法弥补自己客观能力上的不足。 无论如何,这段经历还是相当宝贵的:经历了第一次英语面试、第一次办签证、第一次出国、第一次倒时差,还有第一次误机…… 虽然求职失败,但仍然获益良多。本文便是对这次求职全过程的记录,一方面警醒自己,一方面也为其他有类似打算的朋友们留一个参考。由于几家公司的面试是交错进行的,下文并没有完全按照时间顺序进行描述。此外,出于NDA协定等原因,本文不会透露具体的面试题。 面试准备 虽说去年八月份就已经正式离职,但实际上前几个月都忙于其他事务,...