一、通常的性能问题类型
让我们一起看看那些公共的性能问题,看看他们是或者不是.我们将了解到为什么我们常常在开发期间会错过这些问题.
我们也会看看当我们考虑性能时语言的选择、延迟、带宽、计算等因素.
二、语言的考虑
人们经常关注所使用的编程语言的速度。然而,这经常没有抓住要点。这是一个非常简单的观点,掩盖了技术选择的细微差别,
用任何语言编写速度慢的软件都很容易。由于当今计算机的处理速度非常强大,所以解释性能相对较慢的语言通常足够快,而开发中性能的提高是值得的.
要理解所涉及的论点和权衡是很重要的,即使在读完这本书之后您决定使用C#和.NET.
编写速度最快的软件的方法是深入了解底层硬件并用汇编语言编写。(甚至机器代码)。但开发、调试和测试都很复杂,这需要专家形
知识。我们现在很少这样做,除了非常小的应用程序(如虚拟现实游戏、科学数据处理,有时还有嵌入式设备),但通常只用于软件的一小部分.
C#在速度和灵活性之间提供了良好的平衡,使其适用于各种各样的应用程序,尤其是服务器端Web应用程序
三、性能问题的类别
1.延迟
内存延迟
网络延迟
磁盘IO延迟
繁琐的交互/握手
2.带宽
过载的负荷
未优化的数据
压缩的平衡
3.计算问题
工作于过于大量的数据
计算非必须的结果
暴力的算法
4.响应
可离线处理的同步操作
缓存及处理作废的数据
在为平台编写软件时,通常会受到两种资源的限制。即:计算处理速度和访问远程(到处理器)资源。处理速度如今很少是一个限制因素,这可以用于与其他资源进行交易,
例如,压缩一些数据以减少网络传输时间。
访问远程资源(如主内存,磁盘和网络)将产生各种时间成本。了解处理速度不是受单个值影响,而是多个参数影响非常重要。这些参数中带宽和延迟是最重要的,
延迟是操作开始之前的滞后时间,而带宽是数据在操作开始后转移的速率。提交一个硬盘驱动事件的带宽是非常高的,也是具有非常高的延迟的。这会使来回发送大量文本文件变得非常慢,但是或许,发送大量
3D视频是一个不错的选择(取决于Weissman
得分了)。
移动电话数据连接可能更适合文本文件。 虽然这是一个人为的例子,但是同样的问题通常适用于计算堆栈的每一层,其时间差的数量级相似。
问题在于差异太快无法察觉,我们需要使用工具和科学来看待它们。
解决性能问题的秘诀是对该技术有更深入的了解,并知道在较低级别会发生什么。 您应该了解框架在网络级别上的说明。
掌握这些命令如何在底层硬件上运行以及它们如何受到部署到的基础架构的影响也很重要。
四、什么时候性能是重要的
性能并不总是很重要。知道什么时候是重要的,什么时候不重要,
是非常必要的技能。一般的经验法则是,如果用户需要花事件来等待事情发生,那么就应该让性能良好。如果可以异步执行对用户没有影响,就可以按照异步地方式执行,如:队列,
或者其他非UI线程.
某些情况下,程序被设计为看起来缓慢,主要的原因是为了系统安全,例如一些解密算法.
五、为什么常常没有发现性能问题
在开发中没有注意到性能问题的主要原因之一是一些问题在开发系统上是不可感知的。在延迟增加之前可能不会出现问题。这可能是因为大量的数据被加载到系统中并且检索特定的记录需要更长的时间。这也可能是因为每个系统被部署到单独的服务器上,从而增加了网络等待时间。
另外当数据量没有上来,或者请求量没有上来,这些问题都是难以发现的.所以提前的压测是很有必要的.
当您从一开始就考虑性能时,解决问题的成本更低、速度更快。对于软件开发中的大多数问题来说,这都是正确的。越早抓到BUG
,越好。发现错误的最糟糕的时间是一旦部署,然后由用户报告。与功能性BUG
相比,性能问题有点不同,因为它们通常只在规模上显示出来,除非您去寻找它们,否则在实际部署之前您不会注意到它们。您可以编写集成测试和负载测试,以对照具体的量化目标检查性能,我们将在本书后面讨论这些目标。
热门工具 换一换