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