[翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 平均值 vs 百分比

平均值 vs 百分比

在考虑要性能测试的目标值时,我们需要考虑用什么统计口径。大多数人都会首选平均值,但在大多数情况下,这个正确的,但你也应该适当的考虑百分数。但你有可用性的要求,作为性能测试的目标里肯定会有用百分比作的要求。举个栗子:“数据库请求的平均延迟必须小于10ms,95%是请求必须小于100ms”
。。。(这里我省略了对“95%是请求必须小于100ms”的翻译说明,我觉得中国的程序猿应该看得懂我翻译的那句话)

1,2,2,4,5,5,8,10,10,11,11,11,15,23,24,25,50,87

举个栗子,上面有18个测试下来的值(已经过排序了的),的平均耗是17ms,但有5%的访问超过50ms。如果你刚好只看平均值,你一定会认为一切正常。但当你用了百分比作为指标,你就会知道一些偶发的GC操作会影响到你的访问质量。

百分比是高可用性的最重要指标。如果你需要更高的可靠性,就需要提出一个更高的百分数指标。通常来说99%已经很好了,但你还会可能有99.99% 99.999%,甚至更高的指标,但通常来说,决定采用这些指标数字取决于业务,而不是开发。

这里作为翻译的我,来补一些关于百分比的数据
99% 允许每年服务器挂 3.65 天(多让人尴尬的数据啊,但我相信很多公司服务器不一定达能到这个要求)
99.9% 允许每年挂 8.76 小时(1年出了一次较大的事故,基本就用完额度了)
99.99% 允许每年挂 52.6 分钟(1年只能出一次小的事故,还得是能立即解决的)
99.999% 允许每年挂 5.26 分钟(如果真的发生小于这个时间的事故,对于用户来说一般很难有感知,但是在淘宝双十一零点之后的一个小时内碰上的话 (=@__@=) )
99.9999% 允许每年挂 31 秒(写一个程序在一年的时间里只往控制台输出 hello world的同时还得祈求上帝保证机房不要断电 O(∩_∩)O!)

百分比是一个重要的指标,是因为他可以帮助你了解你的系统,即使通过平均值观察到,你的系统一切正常,但是只有90%的用户访问满足了目标,也会意味着,你还有10%的用户访问还有可以改进的空间。要解决这这部分请求问题,需要的更多是商业上的考量,因为这里会存在一个递减回报的问题,因为提升最后的1%要花的时间不是一般的多。

对于上面的例子“有95%的访问请求满足了50ms以内的需求”,但数据源来说,不符合统计学上对样本数量的要求,至少要要相同数量级的样本才行。要描述 99% 需要统计100个样本,要描述 99.9% 则至少要1000个样本,并以此类推。

再举一个作为翻译我的栗子
话说当年做的页游上线,在开服到了几百人(>500)的时候玩家会觉得比较卡,登陆服务器看了一下cpu和网络情况都不是很高(<30%),内存占也没啥问题。经过后来多方努力,发现是用户首次进入游戏时,为了数据安全,这时候初始化数据库的操作是同步的,而不是异步的。再加上dogse引擎的限定,主逻辑是跑在单线程的队列上,这就导致开服时主线程的阻塞会比较严重。每个玩家卡个200ms,同时有3个玩家进入,剩下的玩家自然会觉得卡了。

对于本书最重要的,而起是要重复说三遍的观点是:

测量,测量,测量

你要知道,如果没有准确的测量,在解决性能相关问题时,你只能按照自己的经验和感觉来判断那里有性能问题。这会存在2个问题:
首先:假设你的感觉是对的,找到了一个性能问题的地方,但你不知道当你修改了这里后,对性能提升了多少
其次:我也不可能告诉你那里经常犯错了。举个栗子(这个栗子我没看懂):在分析一个应用占用里很多非托管内存的问题,我们最初假设是认为在某处加载了一个很大的数据。随后安排开发人员做排查工作,通过禁止某些组件的加载,还调试了转储过程(dump)里堆的数据。结果让我们很吃惊,大部分内存的开销来自于组件(Assembly)加载,而不是我们之前所想的数据加载

如果没有工具做测量,那么性能优化就是没意义的。性能优化是一个连续的过程,你需要有自己的工具来对这个过程做记录。下面的章节将介绍一些常见的工具。恩大部分是免费的,有一款收费的,但是是vs专业版附带的,所以你懂的。

相关文章:

  • [翻译]编写高性能 .NET 代码 第一章:性能测试与工具 -- 选择什么来衡量

原文地址:http://www.cnblogs.com/yahle/p/6530827.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面对枯燥的源码,如何才能看得下去

转载自 面对枯燥的源码&#xff0c;如何才能看得下去 一个软件开发人员&#xff0c;工作到了一定的年限&#xff08;一般是3、4年左右&#xff09;&#xff0c;如果他还没学会阅读源码&#xff0c;那么他就会遇到瓶颈。因为到了这个时候的开发&#xff0c;他应该不仅仅只会做…

前端防xss攻击(去掉空格等能影响和攻击数据库的字段)

用法&#xff1a;把要传给后端的数据放到此能过滤的函数里面即可就能实现自动过滤的功能 eg 代码 export function XSSFilter(str: string) {// 过滤emoji表情str str.replace(/\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g, );// 过滤所有html标签str str.replace(/&l…

[深圳/广州]微软SQL技术沙龙分享会(MVP)

[深圳/广州] 新一期俱乐部活动报名开始&#xff0c;这次是广深地区SQL Server 技术沙龙分享会&#xff08;MVP)&#xff0c;SQL Server作为一个数据平台&#xff0c;不管是SQL Server 2017 on Linux 还是把一门开源R语言融入其最赚钱的旗舰商业数据库&#xff0c;微软已经决定&…

IntelliJ IDEA 2018.2 发布,支持 Java 11

转载自 IntelliJ IDEA 2018.2 发布&#xff0c;支持 Java 11 近期&#xff0c;JetBrains发布了其旗舰产品IntelliJ IDEA的2018.2版本。新版本支持即将推出的Java 11、断点意图&#xff08;Breakpoints Intentions&#xff09;、MacBook的Touch Bar等特性&#xff0c;并改进了…

发布支持多线程的PowerShell模块 —— MultiThreadTaskRunner

应用场景 多线程在需要批量处理一些任务的时候相当有用&#xff0c;也更加有利于充分利用现有计算机的能力。所有主流的开发语言都支持多线程。 默认情况下&#xff0c;PowerShell作为一个脚本语言&#xff0c;是不支持多线程操作的&#xff0c;虽然有所谓的后台任务&#xf…

java中,在一个有序数组中插入元素,使得数组保持有序排列

//已知有一个数组&#xff0c;/*数组里面的元素有a b c d e f y z,从控制台中随机输入一个字母&#xff0c;按照升序的顺序插入到该数组中并且遍历输出。*/public static void test1(){String [] str{"a","b","c","d","e",&…

[翻译]编写高性能 .NET 代码 第一章:工具介绍 -- Visual Studio

Visual Studio vs虽然不是全宇宙唯一的IDE&#xff0c;但它是.net开发人员最常用的开发工具。它自带一个性能分析工具&#xff0c;你可以使用它来做开发&#xff0c;不同的vs版本在工具上会略有差别。 VS可以分析CPU使用率&#xff0c;内存分配以及资源锁情况。它能在你开发与…

Java 程序员必备的 Intellij IDEA 插件

转载自 Java 程序员必备的 Intellij IDEA 插件 来源&#xff1a;柠檬学园 以下是我用过不错的Intellij插件&#xff0c;分享给大家希望能帮到大家。 1. .ignore 地址&#xff1a;https://plugins.jetbrains.com/plugin/7495--ignore 生成各种ignore文件&#xff0c;一键创建g…

表单中去掉重置和提交按钮和搜索框

去掉重置和提交按钮 <ProFormsubmitter{{// 配置按钮文本searchConfig: {resetText: 重置,submitText: 提交,},// 配置按钮的属性resetButtonProps: {style: {// 隐藏重置按钮display: none,},},submitButtonProps: {},// 完全自定义整个区域render: (props, doms) > {c…

ASP.NET 开发者 开始学习ASP.NET Core 2吧

.NET Core 从2016年6月28日发布&#xff0c;过去了将近一年的时间&#xff0c;但是在工作中发现大家对.net core的接受程度并不高&#xff0c;这只是一个感觉&#xff0c;俗话说“没有调查就没有发言权”&#xff0c; 这两天通过微信小程序在微信群里做了一个调查&#xff0c;参…

Spring Boot Redis Cluster 实战干货

转载自 Spring Boot Redis Cluster 实战干货 添加配置信息 spring.redis:database: 0 # Redis数据库索引&#xff08;默认为0&#xff09;#host: 192.168.1.8#port: 6379password: 123456timeout: 10000 # 连接超时时间&#xff08;毫秒&#xff09; pool: max-active: 8 #…

编写高性能 .NET 代码 第一章:工具介绍 -- Performance Counters(性能计数器)

Performance Counters&#xff08;性能计数器&#xff09; 性能计数器是监视应用程序和系统性能的最简单的方法之一。它有几十个类别数百个计数器在&#xff0c;包括一些.net特有的计数器。要访问这些可以通过系统自带的 性能监控程序&#xff08;perfmon.exe&#xff09;来实…

EF通用数据层封装类(支持读写分离,一主多从)

浅谈orm 记得四年前在学校第一次接触到 Ling to Sql&#xff0c;那时候瞬间发现不用手写sql语句是多么的方便&#xff0c;后面慢慢的接触了许多orm框架&#xff0c;像 EF&#xff0c;Dapper,Hibernate,ServiceStack.OrmLite 等。当然每种orm都有各自的优势&#xff0c;也有不足…

前端进行时间段筛选

传给后端参数时进行格式化 weekResultTimeStart:params.insertTime!null?moment(params.insertTime[0]).format(YYYY-MM-DD HH:mm:ss):null,weekResultTimeEnd:params.insertTime!null?moment(params.insertTime[1]).format(YYYY-MM-DD HH:mm:ss):null,注意点&#xff1a; 前…

IdentityServer4(OAuth2.0服务)折腾笔记

以下&#xff0c;称这个使用了IdentityServer4的OAuth2.0服务的项目称为Passport项目。 组件说明&#xff08;Nuget&#xff09; Passport项目所需组件 项目以Asp.net Core Identity项目模板初始化&#xff0c;集成IdentityServer4中间件&#xff1b;集成IdentityServer4.AspN…

map遍历进行展示

{userList.map((item,index)> <Option key{index} value{item.userId}>{item.realName||null}</Option>)||null}

Javase基础

Javase基础1.XML文档作用 保存和传输数据 类如&#xff1a; <标题> 标题 </标题> 2.Java的特性优势&#xff08;编译型语言和解释性语言&#xff09; 1.安全 2.面向对象 3.简单性&#xff08;C&#xff09; 4.高性能 5.分布式 6.多线程 7.高并发 8.跨平台 可移植性…

LocalDateTime与LocalDate之间的相互转换

LocalDateTime转换为LocalDate和LocalTime LocalDate转为LocalDateTime

DDD领域驱动之干货 (一)

说道DDD不得不说传统的架构与DDD的架构区别。 传统的架构不外乎就是三层&#xff0c;而在这三层里面又不断的细分&#xff0c;始终没有达到想要的效果&#xff0c;那么为什么当时还是采用三层。 当然在DDD没有提出的时候三层是大多数人的选择。 那么当领域驱动被提出来的时候…