引言

benny 是一个简单的 benchmark 框架,当你需要测试自己的库或是方法性能时,可使用它来进行对其进行基准测试。

前排先上 GitHub 地址

官方标榜的特性为:

  • 可以简单的编写任何同步或异步代码
  • 可为每个用例单独配置
  • 可选择性跳过或只执行特定的用力
  • 支持多种结果类型:
    • JSON
    • CSV
    • HTML Table
    • HTML Chart
  • 不需要额外的设置几个输出
  • 套件结果为 Promise

使用

先看下使用方法:

const b = require('benny');
b.suite(
    'Example',
    b.add('Reduce two elements', () => {
        [1, 2].reduce((a, b) => a   b);
    }),
    b.add('Reduce five elements', () => {
        [1, 2, 3, 4, 5].reduce((a, b) => a   b);
    }),
    b.cycle(),
    b.complete(),
    b.save({ file: 'reduce', version: '1.0.0' }),
    b.save({ file: 'reduce', format: 'chart.html' })
);

如上定义了一组套件,名称为 Example,然后通过 add 添加两个用例,cycle 用来定义用例的输出,可传入函数来自定义,complete 默认为输出基准测试结果,同样可传入函数来自定义处理。

随后的 save 则是用来保存结果,file 为文件名称,format 为输出的格式。支持的格式上面已经写过,不再赘述。

可尝试执行上述 benchmark 文件然后查看输出结果:

Running "Example" suite...
Progress: 100%
  Reduce two elements:
    213 985 744 ops/s, ±0.61%   | fastest
  Reduce five elements:
    109 395 371 ops/s, ±0.66%   | slowest, 48.88% slower
Finished 2 cases!
  Fastest: Reduce two elements
  Slowest: Reduce five elements
Saved to: benchmark/results/reduce.json
Saved to: benchmark/results/reduce.chart.html

默认会输出用例名称及其执行效率,如上 Reduce two elements 部分为该用例名称,213 985 744 ops/s 为执行效率表示该方法每秒执行了 213 985 744 次,±0.61% 为单案例执行时采集结果的误差范围值,fastest 表示其为最快的用例,slowest 其为最慢的用例,非最快用例后会标注效率的百分比差。

如果使用了图表还可打开图表查看,会更直观,如上结果对应的图表为:

图表可直接将输出的图表 html 打开查看,其中使用 chart.js 进行渲染。

其他功能

除了上述基础使用,benny 还提供了一些其他的功能,比如可以通过调用 add.skip 来跳过某个用例,或 add.only 来跳过所有其他用例只执行该用例。

如果用例代码为异步代码,直接将用例定义为 async 即可。

add('Async benchmark without setup', async () => {=
    await delay(0.5);
    // 结果为 2 ops/s
});

除此之外 benny 还支持一些自定义选项:

delay - 每次测试用例执行后的休息时间

initCount - 每次测试用例执行前的初始化次数

maxTime - 执行的最大次数

minTime - 执行的最小次数

minSamples - 最小采样次数

配置的方式有两种,一种是通过 configurecases

b.configure({
    cases: options
});

即可为所有用例添加配置,也可在 add 时为单个用例添加配置:

b.add(
    'Reduce two elements',
    () => {
        [1, 2].reduce((a, b) => a   b);
    },
    options
);

除了上述配置外,configure 还可配置一些全局配置,不过目前只有一个 minDisplayPrecision,用来配置输出内容的精度,默认为 2。

总结

通过 benny 可以方便的为一些方法等进行基准测试,方便查看函数的执行效率,测量各种代码的性能,并且支持多种输出结果,方便各种场景下展示结果。

如果有类似需要测量函数性能,或者想要测量某些变更对性能的影响程度时,不妨试试看。

以上就是benny简单框架benchmark功能使用的详细内容,更多关于benny框架benchmark功能的资料请关注Devmax其它相关文章!

benny简单框架benchmark功能使用的更多相关文章

  1. xcode6.1 – Xcode 6.1中项目模板中缺少类前缀

    项目模板上曾经有一个类前缀字段,这有助于区分项目类和框架类.Xcode6.1项目模板中不再提供此功能.这背后的意图是什么?

  2. ios – 伞框架

    错误.应用程序,通常位于…错误仍然存在你也可以在这里添加(子)框架的路径.

  3. ios – UIView框架大小的问题

    我正在开发一个iPad项目,目前正在使用Landscape视图.我试着这样做:为什么这总是返回960?虽然在景观中,视图本身的高度尺寸应为768对吗?

  4. 安装自定义cocoa框架的最佳方法

    我有一个自定义框架,遵循Apple的框架编程指南>>中的建议.Installingyourframework我在/Library/Frameworks中安装.我通过使用以下脚本添加RunScript构建阶段来完成此操作:在我的项目中,我然后链接/Library/Frameworks/MyFramework并将其导入我的类中,如下所示:这非常有效,除了我总是在调试器控制台中看到以下消息:Loadin

  5. ios – 在设备上构建和运行时,仅将嵌入式框架与其他动态框架链接失败

    TL;博士将您的嵌入式框架与其他框架链接,并且不将其他框架与您的应用程序链接,导致Build&在设备上运行.描述:建立:我的设置非常简单(Swift2.3&XcodeXcode8.0;Build版本8S162m):>使用Carthage(0.17.2)我用xcodebuild8.0和TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3carthagebui

  6. iOS 8嵌入式框架中的头文件

    我正在尝试创建一个用于iOS8的嵌入式框架.在创建一个名为SampleKit(BTW;这里有任何约定,我应该使用前缀吗?)之后,它包含一个令我困惑的头文件:我知道FOUNDATION_EXPORT是extern或extern“C”的宏,但我不确定这两个常量.我应该在哪里为他们设定价值?解决方法项目>构建设置>版本控制>当前项目版本:

  7. 在Monotouch上模拟.NET的框架?

    有没有人使用过他们发现与Monotouch兼容的.NET模拟框架?在尝试使用之前,我很好奇与NMock,NSubstitute,Moq和其他框架的兼容性.Xamarin刚刚加强了它的单元测试支持,但没有提到模拟框架.仅供参考,我希望在VS2010上为非UI位做很多开发,并在UI进入时移动到iOS平台.谢谢您的帮助.解决方法我建议只使用手动模拟:如果我不得不猜测RhinoMocks,Moq等大量使用Reflection.Emit(你怎么能做他们能做的疯狂?),这将无法在MonoTouch上使用AOT编译器运

  8. 在ios上使用来自框架的boost :: filesysystem路径

    我一直在使用Boost作为PeteGoodliffe脚本构建的框架已有一段时间了.效果很好.最近我遇到了一个问题,可以通过将以下代码放入另一个全新的XCode项目中的视图控制器的viewDidLoad中来重现:当路径对象被销毁时会导致EXC_BAD_ACCESS.有没有其他人遇到这个问题?

  9. ios – 在约束依赖于框架的自定义视图中使用自动布局

    我正在编写一个以编程方式初始化的自定义视图.我重写updateConstraints以添加此视图所需的所有约束.:问题是self.bounds返回CGRectZero的等价物.我做了我的研究并根据这个objc.ioarticle,这是预期的,因为在调用layoutSubviews之前框架不会被设置.它也提到了Toforcethesystemtoupdatethelayoutofaviewtreei

  10. ios – “禁用模块时使用’@import’”错误 – 启用模块和链接框架= YES

    我有一个使用CocoaPods并使用’SCLAlertView-Objective-C’窗格的项目.该pod使用@importUIKit;模块样式导入.我在目标和项目设置中将“启用模块(C&Objective-C)”和“自动链接框架”设置为YES.当模块被禁用时,我仍然得到“使用’@import’错误.有没有什么可以阻止Xcode能够启用模块,如使用.pch文件,任何链接器标志,或者我没有提到的任

随机推荐

  1. Error: Cannot find module ‘node:util‘问题解决

    控制台 安装 Vue-Cli 最后一步出现 Error: Cannot find module 'node:util' 问题解决方案1.问题C:\Windows\System32>cnpm install -g @vue/cli@4.0.3internal/modules/cjs/loader.js:638 throw err; &nbs

  2. yarn的安装和使用(全网最详细)

    一、yarn的简介:Yarn是facebook发布的一款取代npm的包管理工具。二、yarn的特点:速度超快。Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级可靠。使用详细、简洁的锁文件格式和明确的安装算法,Yarn 能够保证在不同系统上无差异的工作。三、y

  3. 前端环境 本机可切换node多版本 问题源头是node使用的高版本

    前言投降投降 重头再来 重装环境 也就分分钟的事 偏要折腾 这下好了1天了 还没折腾出来问题的源头是node 使用的高版本 方案那就用 本机可切换多版本最终问题是因为nodejs的版本太高,导致的node-sass不兼容问题,我的node是v16.14.0的版本,项目中用了"node-sass": "^4.7.2"版本,无法匹配当前的node版本根据文章的提

  4. nodejs模块学习之connect解析

    这篇文章主要介绍了nodejs模块学习之connect解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. nodejs npm package.json中文文档

    这篇文章主要介绍了nodejs npm package.json中文文档,本文档中描述的很多行为都受npm-config(7)的影响,需要的朋友可以参考下

  6. 详解koa2学习中使用 async 、await、promise解决异步的问题

    这篇文章主要介绍了详解koa2学习中使用 async 、await、promise解决异步的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. Node.js编写爬虫的基本思路及抓取百度图片的实例分享

    这篇文章主要介绍了Node.js编写爬虫的基本思路及抓取百度图片的实例分享,其中作者提到了需要特别注意GBK转码的转码问题,需要的朋友可以参考下

  8. CentOS 8.2服务器上安装最新版Node.js的方法

    这篇文章主要介绍了CentOS 8.2服务器上安装最新版Node.js的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. node.js三个步骤实现一个服务器及Express包使用

    这篇文章主要介绍了node.js三个步骤实现一个服务器及Express包使用,文章通过新建一个文件展开全文内容,具有一定的参考价值,需要的小伙伴可以参考一下

  10. node下使用UglifyJS压缩合并JS文件的方法

    下面小编就为大家分享一篇node下使用UglifyJS压缩合并JS文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

返回
顶部