Amdahl's law

记得以前有一个同事争辩为什么不使用PHP 5的类功能时,说他做了一个试验,那就是使用普通函数方式比类方式效率要高出10倍以上。对于他的这个理由,当时我也一时反应不过来,事情就这样不了了之了。后来仔细想了一下,他的这个试验并不能说明什么问题。在一个系统中,会有很多的部分,系统运行的性能是取决整体的所有部分之合,而不仅仅是某一个部分。特别是,在Web应用中,最大的瓶颈是网络响应以及数据库访问,像PHP类封装产生性能消耗所占比重其实是微乎其微的。假设PHP类代码执行的时间占整个系统的10%,那么即便优化到零占用(该部分的效率提高就何止是一千一万倍,简直就是无穷),那么整体的性能也不过是提高了10%而已!所以,关键是不是提高单点的性能,而是整体的性能。与其在不重要的地方花功夫,还不如找到真正的瓶颈,以达到四两拨千斤的效果。

今天看文章才知道,原来上面的道理早就是定理了,那就是 Amdahl's law。其大意是,如果一个占整个任务比重为P的组件的运行效率为原来S倍,那么当S->∞的时候,效率的最大提升也不过是1/(1-P)。

由此,我们可以知道,要提高整体性能,必须是全方位的。由此,也得出,在串行计算的系统中,路径上的任何一块都可能是整个系统的瓶颈。必须把每个任务都化成为独立的子任务并行执行,使得每个一个P值都可以接近于1。

因为 Amdahl's law的存在,所以 有人指出现有的N-层软件架构是有问题的。因为N-层架构是由不同的层次组成的,即每个层次只占整个任务的一部分比重即P。这使得扩展很复杂,而且不同层次扩展的方式以及效果并不一样,所以不符合线性可扩展性。即限于P的值,增加再多的硬件,再多的优化,最多也只能达到1/(1-P)的效果。因此提出,把所有的n-层架构都整合在一个处理单元(process unit)里,这样就可以通过直接增加处理单元而完成线性可扩展性。

乍看起来,这么说也是有道理的。提高系统的内聚性,减少对外的耦合,这是模块化原则,也是性能提高的原则,因为耦合总会带来性能的下降。不过再想想,这样处理扩展性,虽然看起来很简单了,却不利于分工和合作。这样的话,整个就是一个封闭系统,开发和维护就复杂了。N层结构的好处,就是不同层次之间的交互只是通过接口,这样利于不同层的内部创新,简化每个层的工作。而且毕竟不同层次的工作是各有特点的,使用不同的扩展机制也是为了达到更大的优化(相反,一视同仁的优化方式未必对所有层次都能达到最优)。

还是根据 Amdahl's law,我们需要把任务进行分解成独立子任务,以并行执行。分解之后,因为每个子任务都很简单,那么就可以比较好的优化,可以更高效的执行,这也是Google的 MapReduce技术的基本原理。

如何定任务,使得其可以相对独立,可以高效运行,线性扩展,这就是问题的关键了。你可以说是完成一个复杂的完整的业务逻辑,也可以说只是完成一个简单的存贮动作。不同的层次,不同的粒度,视情况需要了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值