【锁定直播】字节、华为云、阿里云等技术专家讨论如何将大模型接入 AIOps 解决实际问题,戳>>> 了解详情
写点什么

基准测试(Benchmarks)不必消亡

  • 2017-07-25
  • 本文字数:4371 字

    阅读完需:约 14 分钟

重点摘要

  • 基准测试帮助社区把他们对用户行为的理解编码
  • 所有基准测试面对愚弄和作弊都会显得不堪一击
  • 跟踪和性能分析可以替代测试中老旧过时的用户行为模型
  • 没有可以在不同项目间共享跟踪数据的常用工具
  • 测试能够作为性能退化测试的一部分永远存在下去

Chromium 项目近期宣布他们将要弃用一个传统的 JavaScript 基准测试,Octane,主张通过跟踪和性能分析收集真实场景下的性能测量数据来驱动性能提升。这种性能指标,是通过对用户的跟踪和分析收集而来的。

对于弃用 Octane,他们给出的理由是,使用传统的基准测试测出的 JavaScript 性能表现已经到了稳定期,而且最终,开发者总会找到愚弄这些基准测试的方法。

不过,尚在快速演进 JavaScript 社区之外的跟踪和是否就是性能工程的未来呢?是否一切基准测试都有保质期呢?

基准测试

所有优秀的基准测试都在模拟真实世界的工作负荷。它们内置有对诸如执行时间、延迟和吞吐量、以及每秒操作次数等指标的测量能力,这种测量能力能让开发者了解他们软件的表现。

本质上说,基准测试的目的是允许用户在不同软件版本和配置之间进行比较。以完全相同的工作负荷排除掉其他因素,从而能够单独比较代码上的区别。

拥有一个封装好的的工作负荷对于软件优化工作的编写和测试是无价之宝,因为它能让开发者感知到他们所做的改变对用户体验的影响。基准测试是仲裁者。开发者们判断自己所做的改变对性能表现的影响是好是坏,还有最终,对用户的影响是好是坏。基准测试结果上 15% 的提升,可能转化为网页加载时间上 25 毫秒的缩短。

很多备受欢迎的项目就是这样完成性能优化的:选择一个基准测试工具然后开始优化那些被历经的代码路径,直到性能得到显著提升。如果没有现有的基准测试工具可用,有些项目组甚至会自行编写基准测试工具

用人工或综合的方式测试某个特定的部件的基准测试,被称为微基准测试(Micro-Benchmark)。微基准测试在一些方面非常有用,比如理解软件将来会如何规模化,或者了解某个部件的绝对最高性能表现,即使如今已经不可能让该部件达到最大负载。

当使用全面基准测试过于麻烦的时候,使用微基准测试对于指导软件优化是有帮助的。举一个例子,当你需要对一个没有开放 API,且需要被直接访问的缓存层进行性能提升的时候。又或者,当一个开发者想要重现一个很难触发的性能问题的时候。

微基准测试有一个难以编写正确的坏名声,然而也存在着很多他们被成功用来获得性能增益的例子。

基准测试不仅对提升性能有帮助,他们也可以被用做退化测试的基准,以保证即使代码发生变化,性能表现也可以保持稳定。考虑到性能表现不像正常 / 异常这种二元状态,不能明显的观测到是否出现倒退现象,因此系统化的性能退化跟踪对于成熟的项目成熟的项目非常重要。

也许最重要的一点是,发布精心设计的基准测试可以整合全社区对有趣的工作负载和用户行为的理解。基准测试可以指导所有开发者(特别是新来的那些)去提高那些最重要的代码,由于最佳的优化,就是找出那些普遍存在的情形,并为之做出调整。

然而,如同 Google Chromium 团队指出的那样,基准测试存在着很多的缺点。

如果一个基准测试不再能够代表项目相关的工作负荷,或者更糟,它从来不能,那么那些以基准测试有效为前提编写的代码,将不得不被重写。这些之前编写的代码很可能是对开发时间的巨大浪费。

有的时候,你最好的选择是从头重写一个全新的基准测试,而不是更新已有的那个。

但是即使你的基准测试可以准确重现目前的用户行为,它的配置信息也可能会复杂到让很多人无法正确使用。基准测试越复杂,出现这种情况风险越大。参数可以被无脑的复制黏贴,极少甚至完全不考虑这些配置参数对目前被测的软件是否有意义。

并不是所有人在运行基准测试时都怀着最好的出发点,有些人会有意的尝试利用每一个漏洞来获得好处。有些基准测试一直致力于通过限定允许标志的方式来阻止编译器过度的优化代码。深度优化会让编译器消除或简化生成的代码并违背了基准测试的本意。

当所做的一切都纯粹是为了更好的测试分数而非用户时,这中行为被称作愚弄测试(Gaming the benchmark)或者针对测试的优化,这种优化被称作 “基准测试专用优化”。Chrome V8 JavaScript 引擎包含着一个 SunSpider 测试的专用优化。

“V8 使用一个相对简单的技巧:既然每个 SunSpider 测试都在一个新的

2017-07-25 18:283960

评论

发布
暂无评论
发现更多内容

云图说|应用魔方AppCube:揭秘码农防脱神器

华为云开发者联盟

低代码 华为云 AppCube 云图说 应用魔方

JAVA 九种排序算法详解(下)

加百利

Java 数组 排序 7月日更

银行4.0时代的营销与风控之路

索信达控股

大数据 金融科技 数字化转型 银行数字化转型 营销数字化

Hive学习笔记(一)

五分钟学大数据

hive 7月日更

QuFi挖矿APP开发|QuFi挖矿系统软件开发

记某百亿级mongodb集群数据过期性能优化实践

杨亚洲(专注MongoDB及高性能中间件)

Java MySQL 数据库 mongodb 分布式数据库mongodb

共36万字!为上岸Alibaba,我把Github上Java面试题都整理了一遍

Java 编程 程序员 架构 面试

卧薪尝胆30天!啃透京东大牛的高并发设计进阶手册,终获P7意向书

Java 编程 程序员 架构 面试

CDH 安装搭建(二)

大数据技术指南

CDH 7月日更

云端赛车-Amazon DeepRacer 的前世今生

亚马逊云科技 (Amazon Web Services)

人工智能 开源

手机如果能折叠能卷的话,电脑为什么不能呢?

船医特拉法尔加

开发者 工具 柔性屏

手把手教你实现聚光灯效果

ThingJS数字孪生引擎

大前端 可视化 智能灯控 数字孪生

Java项目实战营总结

eoeoeo

Go 学习笔记之 字符串数据类型

架构精进之路

Go 语言 7月日更

监测生命体征、活动水平的可穿戴电子产品设计方案

不脱发的程序猿

物联网 ADI 可穿戴电子产品设计方案 监测生命体征、活动水平 智能传感器

字节跳动有状态应用云原生实践

火山引擎开发者社区

云原生 后端

程序员如何提高开发效率?

万事ONES

项目管理 程序员 敏捷开发 ONES

渗透工程师必看-网络安全法条例-国家安全法介绍和案例

学神来啦

运维 黑客 安全 渗透

阿里的架构师一致好评!IT界首版全栈架构师全栈“成长笔记”开源!

Java架构追梦

Java 阿里巴巴 架构 面试 成长笔记

部分简单网页的基础了解

Emotion

html html5 Html报文解析 内部样式、 CSS语法

MySQL连接数管理

Simon

MySQL

腾讯上线零点巡航,用Java手撕一个人脸识别系统

北游学Java

Java 腾讯 人脸识别

云原生打包工具:Buildpacks

QiLab

Docker 云原生 k8s buildpacks

对EF Core进行扩展使支持批量操作/复杂查询

Spook

EF Core

爱了!阿里巴巴 Java 面试参考权威指南(泰山版)5月版开源

Java 编程 程序员 架构 面试

linux网络编程—7层网络以及5种Linux IO模型以及相应IO基础

Linux服务器开发

后端 网络编程 Linux服务器开发 网络模型 IO模型

区块链时代下,企业如何打造数据要素的“新竞争力”?

旺链科技

大数据 产业区块链

这套获50w+星标的算法神仙文档,足你解决90%的对手,牛逼

编程 程序员 架构 面试

数据归档 - 冷热数据处理大师

趣链科技

数据处理 区块链+

mPaaS 月度小报 | CodeDay#6 成都站落幕,下一站北京;上新季:新容器、新官网、新视觉

蚂蚁集团移动开发平台 mPaaS

移动开发 mPaaS

开源即巅峰!阿里首次分享:Java架构师全栈“成长笔记”

Java架构师迁哥

基准测试(Benchmarks)不必消亡_JavaScript_Matt Fleming_InfoQ精选文章