《ASP.NET Core 高性能系列》关于性能的闲聊
一、通常的性能问题类型
让我们一起看看那些公共的性能问题,看看他们是或者不是.我们将了解到为什么我们常常在开发期间会错过这些问题.我们也会看看当我们考虑性能时语言的选择、延迟、带宽、计算等因素.
二、语言的考虑
人们经常关注所使用的编程语言的速度。然而,这经常没有抓住要点。这是一个非常简单的观点,掩盖了技术选择的细微差别,用任何语言编写速度慢的软件都很容易。由于当今计算机的处理速度非常强大,所以解释性能相对较慢的语言通常足够快,而开发中性能的提高是值得的.要理解所涉及的论点和权衡是很重要的,即使在读完这本书之后您决定使用C#和.NET.
编写速度最快的软件的方法是深入了解底层硬件并用汇编语言编写。(甚至机器代码)。但开发、调试和测试都很复杂,这需要专家形知识。我们现在很少这样做,除了非常小的应用程序(如虚拟现实游戏、科学数据处理,有时还有嵌入式设备),但通常只用于软件的一小部分.
C#在速度和灵活性之间提供了良好的平衡,使其适用于各种各样的应用程序,尤其是服务器端Web应用程序
三、性能问题的类别
1.延迟
内存延迟
网络延迟
磁盘IO延迟
繁琐的交互/握手
2.带宽
过载的负荷
未优化的数据
压缩的平衡
3.计算问题
工作于过于大量的数据
计算非必须的结果
暴力的算法
4.响应
可离线处理的同步操作
缓存及处理作废的数据
在为平台编写软件时,通常会受到两种资源的限制。即:计算处理速度和访问远程(到处理器)资源。处理速度如今很少是一个限制因素,这可以用于与其他资源进行交易,例如,压缩一些数据以减少网络传输时间。访问远程资源(如主内存,磁盘和网络)将产生各种时间成本。了解处理速度不是受单个值影响,而是多个参数影响非常重要。这些参数中带宽和延迟是最重要的,
延迟是操作开始之前的滞后时间,而带宽是数据在操作开始后转移的速率。提交一个硬盘驱动事件的带宽是非常高的,也是具有非常高的延迟的。这会使来回发送大量文本文件变得非常慢,但是或许,发送大量3D视频是一个不错的选择(取决于Weissman
得分了)。
移动电话数据连接可能更适合文本文件。 虽然这是一个人为的例子,但是同样的问题通常适用于计算堆栈的每一层,其时间差的数量级相似。 问题在于差异太快无法察觉,我们需要使用工具和科学来看待它们。
解决性能问题的秘诀是对该技术有更深入的了解,并知道在较低级别会发生什么。 您应该了解框架在网络级别上的说明。 掌握这些命令如何在底层硬件上运行以及它们如何受到部署到的基础架构的影响也很重要。
四、什么时候性能是重要的
性能并不总是很重要。知道什么时候是重要的,什么时候不重要,是非常必要的技能。一般的经验法则是,如果用户需要花事件来等待事情发生,那么就应该让性能良好。如果可以异步执行对用户没有影响,就可以按照异步地方式执行,如:队列,或者其他非UI线程.
某些情况下,程序被设计为看起来缓慢,主要的原因是为了系统安全,例如一些解密算法.
五、为什么常常没有发现性能问题
在开发中没有注意到性能问题的主要原因之一是一些问题在开发系统上是不可感知的。在延迟增加之前可能不会出现问题。这可能是因为大量的数据被加载到系统中并且检索特定的记录需要更长的时间。这也可能是因为每个系统被部署到单独的服务器上,从而增加了网络等待时间。另外当数据量没有上来,或者请求量没有上来,这些问题都是难以发现的.所以提前的压测是很有必要的.
当您从一开始就考虑性能时,解决问题的成本更低、速度更快。对于软件开发中的大多数问题来说,这都是正确的。越早抓到BUG,越好。发现错误的最糟糕的时间是一旦部署,然后由用户报告。与功能性BUG相比,性能问题有点不同,因为它们通常只在规模上显示出来,除非您去寻找它们,否则在实际部署之前您不会注意到它们。您可以编写集成测试和负载测试,以对照具体的量化目标检查性能,我们将在本书后面讨论这些目标。
《ASP.NET Core 高性能系列》关于性能的闲聊的更多相关文章
- 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!
写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...
- 《ASP.NET Core 高性能系列》关于.NET Core的配置信息的若干事项
1.配置文件的相关闲话 Core自身对于配置文件不是必须品,但由上文分析可知ASP.NET Core默认采用appsettings.json作为配置文件,关于配置信息的优先等级 命令行>环境变量 ...
- 《ASP.NET Core 高性能系列》关于.NET Core的部署方式
概述,.NET Core应用程序可以创建三种类型的部署:FDD SCD FDE 框架依赖的部署(FDD).顾名思义,框架依赖的部署(FDD)依赖于目标系统上是否存在.NET Core版本.由于.NET ...
- 《ASP.NET Core 高性能系列》ASP.NET Core的启动过程(1)
一.一切从头开始 简述:知道事情的真相就应该从头 开始,下面我们代码先行 public class Program { public static void Main(string[] args) { ...
- 《ASP.NET Core 高性能系列》静态文件中间件
一.概述 静态文件(如 HTML.CSS.图片和 JavaScript等文件)是 Web程序直接提供给客户端的直接加载的文件. 较比于程序动态交互的代码而言,其实原理都一样(走Http协议), ASP ...
- 《ASP.NET Core 高性能系列》环境(EnvironmentName)的设置
一.概述 程序启动时Host捕获到环境相关数据,然后交由IEnvironment(传说要作废,但是觉得这个有设计点问题,因为.NET Core 非Web怎么处理?),然后交由IWebHostEnvir ...
- 《ASP.NET Core 高性能系列》Span<T>和Memory<T>
一.Span<T>概述 原文:Provides a type- and memory-safe representation of a contiguous region of arbit ...
- 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之三 —— 配置
==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...
- 【译】ASP.NET Core 6 中的性能改进
原文 | Brennan Conroy 翻译 | 郑子铭 受到 Stephen Toub 关于 .NET 性能的博文的启发,我们正在写一篇类似的文章来强调 6.0 中对 ASP.NET Core 所做 ...
随机推荐
- 喵喵电影git操作
1.git remote 2.git remote add origin '项目地址' (origin为远程仓库名字) 3.git remote 4.git push origin master ...
- RabbitMQ-事务和Confirm消息确认
,如果要保证消息的可靠性,需要对消息进行持久化处理,然而消息持久化除了需要代码的设置之外,还有一个重要步骤是至关重要的,那就是保证你的消息顺利进入Broker(代理服务器),如图所示: 正常情况下,如 ...
- H3C保存当前配置--用户图示(console)以上
<H3C>save //此种保存只默认保存为Startup.cfg ,系统默认是加载此文件 The current configuration will be writte ...
- Linux 内核class_simple 接口
class_simple 接口意图是易于使用, 以至于没人会抱怨没有暴露至少一个包含设备的被 分配的号的属性. 使用这个接口只不过是一对函数调用, 没有通常的和 Linux 设备模型 关联的样板. 第 ...
- Linux 内核 MODULEDEVICETABLE 宏
这个 pci_device_id 结构需要被输出到用户空间, 来允许热插拔和模块加载系统知道什 么模块使用什么硬件设备. 宏 MODULE_DEVICE_TABLE 完成这个. 例如: MODULE_ ...
- jedis 连接池工具类
maven <properties> <jedis.version>3.0.1</jedis.version> <junit.verion>4.12&l ...
- 使用struts2进行登录功能的开发
使用struts2进行登录功能的开发 一. 设计需求 使用idea和maven开发具有登录功能的web应用,java语言,使用struts2框架. 二. 设计步骤 1.使用idea创建maven应用, ...
- dWebpack编译速度优化实战
当你的应用的规模还很小时,你可能不会在乎Webpack的编译速度,无论使用3.X还是4.X版本,它都足够快,或者说至少没让你等得不耐烦.但随着业务的增多,嗖嗖嗖一下项目就有上百个组件了,也是件很简单的 ...
- redis集群数据迁移txt版
./redis-trib.rb create --replicas 1 192.168.112.33:8001 192.168.112.33:8002 192.168.112.33:8003 192. ...
- sql函数实用——字符函数(sqlserver与mysql对比)
1.获取长度 sqlserver写法:关键字:len() 获取参数的字符数量 select Len('aksjdhh') 输出结果 7 select len('张无忌ooo') 输出 ...