写点什么

基准测试(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:284821

评论

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

【5.05-5.12】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

Django查询、删除、更新数据

测吧(北京)科技有限公司

测试

网页版超强ChatGPT插件应用ZipZap来了,每日免费10K Token足够使用

Ricky

openai ChatGPT GPT-4

MySQL主从配置+ThinkPHP5分布式数据库

北桥苏

MySQL 分布式 thinkphp

如何解决由于TLS版本不兼容导致的问题

JefferLiu

Java TLS

京东短网址高可用提升最佳实践 | 京东云技术团队

京东科技开发者

最佳实践 高可用设计 企业号 5 月 PK 榜 短网址

以数据思维和技能提升数据应用测试实践 | 京东云技术团队

京东科技开发者

测试 测试覆盖率 数据思维 应用安全测试 企业号 5 月 PK 榜

Django基本数据访问

测吧(北京)科技有限公司

测试

大模型时代入场级技能:提示词工程!百度文心中文教程来啦

飞桨PaddlePaddle

百度飞桨

数据库外网ip binlog主从配置

Java你猿哥

Java MySQL 后端 ssm

Prompt learning 教学[进阶篇]:简介Prompt框架并给出自然语言处理技术:Few-Shot Prompting、Self-Consistency等;项目实战搭建知识库内容机器人

汀丶人工智能

人工智能 深度学习 ChatGPT prompt learning

国内商业BI工具介绍,瓴羊Quick BI、帆软怎么样

流量猫猫头

一种KV存储的GC优化实践

vivo互联网技术

KV存储 GC设计

软件测试是青春饭吗?

测吧(北京)科技有限公司

测试

2023 开源之夏来啦!报名 MegEngine 项目,赢取万元奖金!

MegEngineBot

深度学习 开源之夏 MegEngine 学生比赛 奖金

夺冠秘诀?华为软件精英挑战赛两届冠军这样复盘比赛经验

华为云开发者联盟

云计算 华为云 华为云开发者联盟 企业号 5 月 PK 榜

Alibaba技术专家倾心五年打造!Java工程师成神之路(基础篇)

Java

中建信息亮相华为中国合作伙伴大会2023

极客天地

Windows本地搭建RabbitMQ Server

北桥苏

Rabbit MQ RabbitMQ安装

BATM面试Java岗:精选200+面试题及答案、6大重点规划和经验总结

Java你猿哥

Java MySQL JVM 多线程 java面试

Fabarta 参加 2023 数云原力大会,与各方共同发布《2023 数据资产盘点实践白皮书》

Fabarta

数据要素 数据资产管理 数据资产化 数据要素流通

面试官:说说 WebSocket 和 Socket 及 Http 的区别?

Java你猿哥

Java TCP ssm HTTP webSock

Java面试题大全(整理版)1000+面试题附答案详解最全面看完稳了

Java你猿哥

Java MySQL redis mybatis java面试

数据治理三大模式详解,治理新范式释放数据潜能

袋鼠云数栈

数据治理

微信小程序二维码文件流上传到OSS解决方法

北桥苏

php OSS thinkphp

详解集群级备份恢复:物理细粒度备份恢复

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 5 月 PK 榜

穿越数据智能“海峡”,企业更需要什么样的数智底座?

用友BIP

软件测试 | admin后台管理

测吧(北京)科技有限公司

测试

中国20强(上市)游戏公司2022年财报分析:营收结构优化,市场竞争进入白热化

易观分析

公司 游戏

大厂工作四年Java经验总结了学习路线规划,所有私藏资料我都贡献出来了

Java你猿哥

Java Spring Boot JVM java基础 java面

硬核!阿里最新出品架构核心场景实战手册,解决99%的架构问题

Java你猿哥

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