1、应该分配和释放多个对象 你应该尽量制止过量分配内存,因为内存分配可能是代价昂扬的。释放内存块可能更高贵,因为大大都分配算符老是诡计毗连临近的已释放的内存块成为更大的块。曲到Windows NT? 4。0 service pack 4。0,在多线程处置中,系统堆凡是都运行得很糟。
堆被一个全局锁庇护,而且在多处置器系统上是不成扩展的。
2。不该该考虑利用处置器高速缓存 大大都人都晓得由虚拟内存子系统招致的hard 页错误代价很高,更好制止。但是许多人认为其他内存拜候办法没有什么区别。自从80486以后,那一概念就不合错误了。
现代的CPUs比RAM要快得多,RAM至少需要两级内存缓存 ,高速L1 缓存能保留8KB数据和8KB指令,而较慢的L2 缓存能保留几百KB的数据和代码,那些数据和代码混合在一路。L1 缓存中内存区域的一个引用需要一个时钟周期,L2 缓存的引用需要4到7个时钟周期,而主内存的引用需要许多个处置器时钟周期。
后一数字不久将会超越100个时钟周期。在许多方面,缓存像一个小型的,高速的,虚拟内存系统。至于和缓存有关的根本内存单位不是字节而是缓存列。Pentium 缓存列有32个字节宽。Alpha 缓存列有64个字节宽。那意味着在L1 缓存中只要512个slot给代码和数据。
。3。决不要缓存频繁利用的数据。软件缓存能够被各类应用法式利用。当一个计算代价很高时,你会保留成果的一个拷贝。那是一个典型的时空折中办法:牺牲一些存储空间以节省时间。若是做得好,那种办法可能十分有效。你必需准确地停止缓存。若是缓存了错误数据,就会浪费存储空间。
若是缓存得太多,其他操做能够利用的内存将会很少。若是缓存得太少,效率又会很低,因为你必需从头计算被缓存 遗漏的数据。若是将时间敏感数据缓存得时间过长,那些数据将会过时。一般,办事器更关心的是速度而不是空间,所以他们要比桌面系统停止更多的缓存。
必然要按期去除不消的缓存,不然将会有运行设置问题。
4。应该创建多个线程,越多越好。调整办事器中起感化的线程数目是很重要的。若是线程是I/O-bound的,将会破费良多时间用来期待I/O的完成-一个被阻塞的线程就是一个不做任何有用工做的线程。
5。应该对数据构造利用全局锁使数据线程平安的最简双方法是把它套上一把大锁。为简单起见,所有的工具都用统一把锁。那种办法会有一个问题:序列化。为了得到锁,每一个要处置数据的线程都必需列队等待。若是线程被一把锁阻塞,它没有在做任何有用的事。当办事器的负载较轻时,那个问题其实不常见,因为一次可能只要一个线程需要锁。
在负载很重的情况下,对锁的剧烈争夺可能就会成为一个大问题。设想在多车道高速公路上发作了一个不测变乱,那条高速公路上的所有车辆都被转向一条狭小的道路。若是车辆很少,那一转换对交通流的速度的影响能够忽略。若是车辆良多,当车辆渐渐并入那条单通道时,交通阻塞会延伸几英里。
有几种手艺可以削减锁合作。
6。没必要留意多处置器机器你的代码在多处置器系统上比在单处置器系统上运行得还要糟,那可能是件令人恶心的事。一个很天然的设法是,在一个N维系统上运行N次会更好。性能很差的原因是合作:锁合作,总线合作,和/或缓存列合作。
处置器都在是争夺共享资本的所有权,而不是做更多的工做。若是你必然要编写多线程应用法式的话,你应该在多处置器盒上对你的应用法式停止强度测试和性能测试。单处置器系统通过时间分片地施行线程而供给一个并发性的假象。多处置器盒具有实正的并发性,合作情况和合作更容易发作。
7。应该始末利用模块化挪用;他们很有趣。 操纵同步模块化挪用来施行I/O操做对大大都桌面应用法式来说是适宜的。但是,他们不是利用办事器上的CPU(s)的好办法。I/O操做要破费上百万个时钟周期来完成,那些时钟周期原来能够被更好天时用。操纵异步I/O你能得到显著进步的用户恳求率和I/O通量,不外增加了额外的冗杂性。
若是你有需要破费很长时间的模块化挪用或I/O操做,你应该考调拨几资本给他们。
。8。不要停止丈量 当你可以丈量你所议论的工作并用数字表达它时,那就暗示你对他有了必然的领会;但是若是你不克不及用数字表达时,你的常识是贫瘠的不克不及令人满意的;那可能是常识的起头,但那时你几乎不成能将你的思惟进步到科学的程度。
- Lord Kelvin (William Thomson)若是意外量你就不克不及领会应用法式的特征。你在暗中中试探,一半是靠推测。若是不识别性能问题,你就不克不及做任何改良或做收工做量方案。丈量包罗黑匣子丈量和profiling。黑匣子丈量的意思是搜集由性能计数器(内存利用,上下文交换,CPU操纵等)和外部检测东西(通量,反映时间等)所显示的数据。
为了profile你的代码,你编译代码的一个东西版,然后在各类前提下运行它,并搜集关于施行时间和过程挪用频次的统计数据。
9。应该利用单一用户,单一恳求的测试办法。 书写ASP和ISAPI应用法式的一个通病是只用一个阅读器去测试应用法式。当他们在Internet上应用他们的法式时,他们才发现他们的应用法式不克不及处置高负载,而且通量和反响时间另人可怜。
10。不该利用现实情况。 人们往往只在几个特定的,人工的情况(如下benchmarks)下调整应用法式。选择和现实情况相对应的各类情况,并为针对各类操做停止优化,那一点很重要。若是你不如许做,你的用户和评论家必然会如许做,而且他们将依此来评判你的应用法式的好坏。