本地性能最大化==处理器调度+内存调度+IO调度

不是只有处理器是有限的资源。内存一样是个有限的资源。

不是只有处理器是用周期来衡量的。内存同样是有周期(或者说时间)的。

如果说处理器只是一个时间资源,那么内存就是一个时间+空间二维资源。

所谓维度,只是主观的概念。测量最重要的是不要miss掉任何东西。象一个线性的内存地址空间,我想用N维来表示它都可以。甚至我也可以用它来表示N维的空间。但我的意思并不是要说明这个很重要或证明任何别的东西。我想表达的是,内存它刚才存在,现在还存在,将来仍然会存在。只要它存在,它就可以“思考”。笛卡尔说,我思故我在。内存说,我在故我思。

放弃内存这么一大片好资源不用而去绞尽脑汁从进程切换的空档中“挤”出点处理器周期出来,是非常愚蠢的行为。试想,如果你是处理器,你会怎么想?进程切换占你工作的百分比是多少?处理器调度真正有意义的“空间”在于代码效率优化。也就是说,它的上司(程序员),派给它的工作任务中,有多少是重复的。如果没有,那么就丝毫空间都没有。如果有,那就要弄清楚到底是什么?因此,如果说有意义,关于处理器调度,真正有意义的只有代码效率的提升。比如,你认为虚拟机太慢,所以决定自己写指令(用很底层的语言或直接用汇编)。别的事情,意义真的不大。比如,我假设进程切换的处理器开销跟你的应用进程的处理器开销一样大。那么即使解决这个问题,你的性能提升也不过一倍而已。面对高峰问题,你仍然得跟你老板提申请或借钱买机器。别无他法------对你来说!

 

组合原理:

按照函数式编程的思想,一切都可以被视作函数。所以我现在就把一切都视为函数,来讨论程序的组合。

程序的组合有两种:一是静态组合,一是动态组合。静态组合指打包;动态组合指运行时组合。

动态组合的目的是为了让代码分工合作。这种组合可能又可以分为多个层次上的组合,系统级的组合,应用级的组合,库级的组合,类级的组合,方法或函数级的组合,甚至网络级的组合。每个层次的组合因为组合环境的不同,使用的方法各不相同。如系统级可能使用WEB SERVICE或REST,HTTP,TCP等等都有可能。网络级的组合象TCP/IP协议组,或DNS协议,路由协议等。应用及库级的组合则可能使用OS级的消息服务或自定协议,对象协议,共享内存等,也可以直接使用网络协议。类级的组合使用共享内存的办法进行通信,也可能使用对象协议或其它通信方式。

方法级的组合则基本上使用“调用”的方式来完成。

而调用又分两种:一种是直接调用,一种是间接调用。如果考虑大量调用的情况(现在最流行的架构方法------分层,设计模式都是这种情况的诱因),直接调用比起间接调用在内存空间上的消耗要节省得多。虽然在处理器资源上的消耗并没有区别(因为同样的工作量,时间仍然是相同的------甚至进栈出栈的总时间都是一样的。因为每一次方法调用都必将分别有一次进栈与出栈的时间------如果不考虑尾调用优化的话)。比如,以直接调用的方式对一个函数调用1次与重复调用10次的区别并不大;但以间接调用的方式对一个函数进行递归10次的调用,就将消耗10倍的内存。因为每次调用都将产生一个全新的栈帧,并且这个栈帧的大小与前面一次调用所产生栈帧的大小一模一样。这就是为什么递归很容易knock down系统的原因。

这是代码层次上的优化。

 

转载于:https://my.oschina.net/digerl/blog/11093

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值