回复: 请教各位大大关于动态内存管理的问题…… 够用就好,有些华丽丽的东西你能理解也能用好不说明别人也能理解能用好。
再有就是你说“难以把其他资源的管理绑定到内存管理上”让我觉得你希望找到一个通用的资源管理模式。不过实际上各种资源都有他自己的区别,从而也没必要有一个通用的管理模式。比如内存,现在gc很好很快,内存也是白菜价,就不需要太扣,可以减少程序的错误也可以提高写code的速度。但是对于其他一些资源就不是这种情况,比如OS资源和硬件资源,甚至特定环境下的内存资源(对于这种对内存控制要求非常精确的环境,C#/Java等语言直接是“不适用”,用别的语言好了,这些语言也不是为了支持这种应用而设计的)。
另外,我也不觉得会存在什么完美的资源管理模式,总是各有各的优缺点。GC的优点就是方便,而且在目前很多应用里工作的非常好,缺点么你也列了不少不过在某些应用中都可以忽略不计。然后其他管理模式的优点可能是精确,最优化内存使用,但缺点就是不够方便。取得某一方面的优势往往不是免费的。
还有你一直很关心效率问题,但是效率真的可以这么省吃俭用下来吗?在C#/Java所在的应用里面,真正的瓶颈往往在DB, 硬盘, 用户输入,网络延迟等。多了几次线程切换又如何?少了一点cache hit又如何?比起那些来就是小巫见大巫。你看看你得task manager上CPU占用最多的是谁?还不是System Idle Process? 闲着也是闲着,整理整理内存不是正好?不要觉得用了GC地球就会变暖。
另外就是GC的效率问题,对于特定的应用可以自己测测看,就我们用下来效率还是很不错的。.NET的话gen 0的清理本来就利用了cache, 然后分级也解决了不少问题。我们的某个网络服务本来C++写的,担惊受怕到处check空指针到处check HResult到处copy string(有人要说了,怎么这么写C++?? 这是网络服务,7*24运行的,如果因为一个空指针Access Violation然后进程重起虽然后面有人看着总还是不太爽。至于string copy么,传给了某人不知道生存期会如何,就让“某人”copy一份自己留神吧……我还要传给别人呢……).
后来转成了C#测试的latency比原来小了30%. 里面主要的提升是什么?是因为人不够聪明写得太多的null pointer check被优化掉了?因为那些HResult check变成了exception check? (C++也有exception, 但是COM对象太多大家都不用) 因为少了那些string copy? 我也不知道,但个人觉得换了新的CPU更快的硬盘才是最大功臣。
再来点空洞的,某些东西是个好东西,但也有他自己的应用范围,如果把一些不适用的情况下强行去用的话,乍一看很有趣,很cool, 很优雅,但其实隐患无穷。语言也是如此, stack也是如此。
此帖于 2008-02-16 11:45 PM 被 cat 编辑.
|