不是只有处理器是有限的资源。内存一样是个有限的资源。
不是只有处理器是用周期来衡量的。内存同样是有周期(或者说时间)的。
如果说处理器只是一个时间资源,那么内存就是一个时间+空间二维资源。
所谓维度,只是主观的概念。测量最重要的是不要miss掉任何东西。象一个线性的内存地址空间,我想用N维来表示它都可以。甚至我也可以用它来表示N维的空间。但我的意思并不是要说明这个很重要或证明任何别的东西。我想表达的是,内存它刚才存在,现在还存在,将来仍然会存在。只要它存在,它就可以“思考”。笛卡尔说,我思故我在。内存说,我在故我思。
放弃内存这么一大片好资源不用而去绞尽脑汁从进程切换的空档中“挤”出点处理器周期出来,是非常愚蠢的行为。试想,如果你是处理器,你会怎么想?进程切换占你工作的百分比是多少?处理器调度真正有意义的“空间”在于代码效率优化。也就是说,它的上司(程序员),派给它的工作任务中,有多少是重复的。如果没有,那么就丝毫空间都没有。如果有,那就要弄清楚到底是什么?因此,如果说有意义,关于处理器调度,真正有意义的只有代码效率的提升。比如,你认为虚拟机太慢,所以决定自己写指令(用很底层的语言或直接用汇编)。别的事情,意义真的不大。比如,我假设进程切换的处理器开销跟你的应用进程的处理器开销一样大。那么即使解决这个问题,你的性能提升也不过一倍而已。面对高峰问题,你仍然得跟你老板提申请或借钱买机器。别无他法------对你来说!
组合原理:
按照函数式编程的思想,一切都可以被视作函数。所以我现在就把一切都视为函数,来讨论程序的组合。
程序的组合有两种:一是静态组合,一是动态组合。静态组合指打包;动态组合指运行时组合。
动态组合的目的是为了让代码分工合作。这种组合可能又可以分为多个层次上的组合,系统级的组合,应用级的组合,库级的组合,类级的组合,方法或函数级的组合,甚至网络级的组合。每个层次的组合因为组合环境的不同,使用的方法各不相同。如系统级可能使用WEB SERVICE或REST,HTTP,TCP等等都有可能。网络级的组合象TCP/IP协议组,或DNS协议,路由协议等。应用及库级的组合则可能使用OS级的消息服务或自定协议,对象协议,共享内存等,也可以直接使用网络协议。类级的组合使用共享内存的办法进行通信,也可能使用对象协议或其它通信方式。
方法级的组合则基本上使用“调用”的方式来完成。
而调用又分两种:一种是直接调用,一种是间接调用。如果考虑大量调用的情况(现在最流行的架构方法------分层,设计模式都是这种情况的诱因),直接调用比起间接调用在内存空间上的消耗要节省得多。虽然在处理器资源上的消耗并没有区别(因为同样的工作量,时间仍然是相同的------甚至进栈出栈的总时间都是一样的。因为每一次方法调用都必将分别有一次进栈与出栈的时间------如果不考虑尾调用优化的话)。比如,以直接调用的方式对一个函数调用1次与重复调用10次的区别并不大;但以间接调用的方式对一个函数进行递归10次的调用,就将消耗10倍的内存。因为每次调用都将产生一个全新的栈帧,并且这个栈帧的大小与前面一次调用所产生栈帧的大小一模一样。这就是为什么递归很容易knock down系统的原因。
这是代码层次上的优化。