npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@condenast/perf-kit

v0.1.4

Published

Perf kit is a toolchain for testing performance regressions in JavaScript code.

Downloads

546

Maintainers

cnjuandelgadillocnjuandelgadilloalexcostacondenastalexcostacondenastsarika_devinenisarika_devinenianil.kumag-ganil.kumag-gsarthak_mohantysarthak_mohantyunviradiyaunviradiyaselvakumar_sampathselvakumar_sampathcnmanjucnmanjuponchosbponchosbalokreddycnalokreddycnmohnish_vuritymohnish_vuritykishor-kumar07kishor-kumar07nbentoncondenbentoncondeshrutiniveditashrutiniveditannagle2nnagle2yarramanoharyarramanoharnitish-tandianitish-tandiajoselee10012024joselee10012024subhash453subhash453nikhilcondenikhilcondeanshul2025anshul2025manjunath_condemanjunath_condedavidstockercondenastdavidstockercondenastramjeetmramjeetmsimeon455simeon455vchand-cnvchand-cnmdmohsinmdmohsinshobhit0309shobhit0309shailvishuklashailvishuklaguru05111984guru05111984vijay-mallikvijay-mallikanarayanananarayananbhavin_condebhavin_condecedric_mascarenhascedric_mascarenhasvkudachivkudachishaik_tasneemshaik_tasneemyogeshwari_sevugarathinamyogeshwari_sevugarathinambhoopaltbhoopaltsahana2104sahana2104suhas-cnsuhas-cnvishu_1007vishu_1007shashank_jaiswalshashank_jaiswalndindirdevarajrdevarajsureneskandarpoursureneskandarpourtamal_banerjeetamal_banerjeejfrederick12jfrederick12timklimowicztimklimowiczvishal_ravivishal_ravirajeshs32rajeshs32vmishra2305vmishra2305deepak_mohandeepak_mohangshankar-ingshankar-inpradeep_nayakpradeep_nayaksabarni-condenastsabarni-condenastdev-anand-94dev-anand-94anubalakrishnananubalakrishnannaveen1601naveen1601sheetalparsasheetalparsavishnusimvisfearvishnusimvisfearvgoelvgoelvinayashreeramvinayashreerammitchellstewartmitchellstewartnhrqznhrqzsnehaksnehakraveena-ramraveena-ramankitkumar02ankitkumar02swati_versoswati_versonoman-cnnoman-cnsaahithisrisaahithisriprasil1107prasil1107imran-condeimran-condesaniyashksaniyashkmithunsathyanmitsmithunsathyanmitssanjana_ssanjana_sjyoti_3009jyoti_3009rajashreearvikar19rajashreearvikar19mala-shanbhagmala-shanbhagac432ac432ssingh417ssingh417nvillatonvillatoricardofbarrosricardofbarrosspelurispeluritdscondenasttdscondenastomsun22omsun22midhunmurali001midhunmurali001saicharan7766saicharan7766suhitrathi-condenastsuhitrathi-condenastdkorenblyumdkorenblyumbbuibbuitejasvi-bgtejasvi-bgvnallasavnallasavikas-scvikas-scskumar7skumar7cyrilpanicker-condenastcyrilpanicker-condenastboygao1992boygao1992saikat_condesaikat_condejasonmarlinjasonmarlinaruncondearunconderoberlanderroberlandernprabhu-cnnprabhu-cnjuliendevlinjuliendevlinvinitha_thiagarajanvinitha_thiagarajanareadmanareadmansamruddhidube24samruddhidube24gapurdevgapurdevakshayjain10akshayjain10utkarsh24utkarsh24suma_ksuma_kcn-rahul-tiwaricn-rahul-tiwaridhanashri027dhanashri027bharathikarunanithibharathikarunanithicn_priyanka14cn_priyanka14prashant_singhpariharprashant_singhpariharm-mallikarjunam-mallikarjunamachelslackatcondenastmachelslackatcondenastkarthik_cnkarthik_cnmuthuprakashvelumanimuthuprakashvelumaniissanjanaissanjanaa-renaa-renacolin-alexacolin-alexanamansingh_bhandarinamansingh_bhandaricnarkhedecnarkhedehebsibal_selvarajhebsibal_selvarajakeshavamurthyakeshavamurthypriyanka_jhapriyanka_jhaklnarayananklnarayananspoorthi.chandrashekarspoorthi.chandrashekarasinghcondeasinghcondeeunianinaeunianinaraxsraxsvivekansvivekansconde_jodeconde_jodejordi.escudejordi.escudennasirovnnasirovunnatikunnatikarhovalearhovalerashmicnrashmicnsiddhu-23siddhu-23atp-engineeringatp-engineeringdanj-cndanj-cnmaila-labibmaila-labibksriniva2ksriniva2andregcabandregcabtchathurtchathurkangkanborakangkanboravinay-prvinay-prjosephrussell-cnjosephrussell-cnanaedzmanaedzmcn-connorbrannigancn-connorbranniganprajwal_keshavprajwal_keshavbabincondenastbabincondenastedisteledistelfrandevinneyfrandevinneyrenovaterenovatecondenastadmincondenastadmincopilot-robotcopilot-robotfennen529fennen529fmadriefmadriegmedinagmedinabigzedbigzedbikubikujoshcondenastjoshcondenastrashmi-raorashmi-raoimakshathimakshathnishkalaadiganishkalaadiganiharanilniharanilkatiasfihivoguekatiasfihivogueprakashn37prakashn37andi.anderson522andi.anderson522davidkofahldavidkofahltollmanztollmanzamalamchtalamalamchtaltdshaptdshapdanhallerdanhallerrajasinghcondenastrajasinghcondenastderrickatcnderrickatcntcetcecnid_engineeringcnid_engineeringlilyhealeylilyhealeymanthanbhoslemanthanbhoslepsharma2psharma2bhumikakhatribhumikakhatriigostuigostucwoldtcwoldtmtzhangmtzhangmanthanrautmanthanrautdrosenbaumdrosenbaumaswani_guptaaswani_guptayakshitayakshitakalyanikasarkalyanikasarshreyapashreyapanatelawscnnatelawscnleahzxxzleahzxxzkatemontkatemonteddlestoneddlestonrttrttanwaukonianwaukonieduardoveraseduardoverasmrgentaxmrgentaxcl4mcl4mspollinispollinifedeavafedeavaguidop91guidop91nithya10nithya10mb_devmb_devemilyatkemilyatkluis_gomezluis_gomezkarmennkarmennkhiaraortizkhiaraortizdmitriy_komarov-cndmitriy_komarov-cnjmcamachojmcamachohariprasath_cnhariprasath_cnsrikanthnssrikanthnssudiptacondenastsudiptacondenastutkarsh_sanjivan-condeutkarsh_sanjivan-condemallicamallicaagururajanagururajanupenpangingupenpangingrjain198rjain198ashwini_upparashwini_upparpmasadepmasadesuresharamsuresharamdhanraj_cndhanraj_cnpratik-guptapratik-guptasamtiffinsamtiffinadityaanand534adityaanand534chandan-condenastchandan-condenastvijayalakshmi-sunagarvijayalakshmi-sunagarnamankumarsinhanamankumarsinhaankushvijay93ankushvijay93likhitalikhitapriyankanandipriyankanandisoumyagundusoumyagunduramya-cnramya-cndikshita_khandkedikshita_khandkeambay_chaurasiaambay_chaurasiamanikandancnmanikandancnrghvndr99rghvndr99mulla2mulla2

Keywords

Readme

Perf Kit

Perf kit is a toolchain for testing performance regressions in JavaScript code. While writing atjson, we created a set of tools for testing performance regressions in our code.

What resulted was this library that leverages the V8 profiler to collect metrics about the performance of our software that we could use to identify:

  • If a proposed change to the codebase impacted performance significantly
  • What, in particular, are performance bottlenecks for a piece of code

Profiling code

Install perf-kit into the repository that you want to add profiles to:

npm install --save-dev @condenast/perf-kit

After it's been installed, add a file under perf-kit that will contain the performance suites to run:

import { run, suite } from "@condenast/perf-kit";

run(
  suite({
    name: "my-first-profiler",
    cases: [],
    runner: test => {
      // Run your code here
    }
  })
);

You can pass as many suites to the run function as you would like.

A suite is made up of the suite name, cases to be run, and the suite runner.

The name is where profiles will be stored for the cpuprofiles that will be generated by the profile script. Cases will be run for every run of the suite. The test cases are shuffled between each run to introduce randomess into the runner to ensure that the results have a stronger significance (and is not due to run order).

The runner is a function that will receive a test case, and is the bit of code that will be measured when profiling.

Commands

profile

npx ts-node ./perf-kit profile --times=10

Options

  • times— The number of times to run each code block.
  • out— The name of the directory to store the profiles. This can be a full path or a relative path
  • verbose— Output progress information during the running of the command.

This will generate cpuprofiles for the whole performance suite.

compare

npx ts-node ./perf-kit compare baseline current

Generating performance profiles

Performance test suites are defined in performance/index.ts and specify a number of test cases to be run by a runner function. Within a test suite, a test run will generate a .cpuprofile of the test runner acting on all of the test cases in a random order. To run the test suites, run npm run perf which by default will run each test suite 10 times and store the .cpuprofile files in performance/profiles/{test suite name}/current. It will additionally aggregate over the test runs to generate a timing.json file in the same directory. The timing file will have distribution data for the sample and cumulative times for each function sampled in the test runs. For now, only functions defined in packages in this repo are included in the tiing file.

Performance profile generation can be configured by including parameters to the npm script. Including a --baseline flag will store the output files in a baseline folder instead of current, or a different folder can be further specified if this is passed as an option. Additionally, the number of runs can be configured by including the --times option:

npm run perf -- --baseline new-baseline-folder --times 20

As a shortcut, npm run perf:baseline is equivalent to npm run perf -- --baseline baseline --times 10.

Comparing performance profiles

Once performance profiles are generated, we can compare the results of one baseline against another by running npm run perf-tstats which will perform a Student's T-Test for every function timing collected over the test runs, as collected in the respective timing.json file in the baseline folder. In short, we consider the timing for every function to be its own random variable, and the timing recorded in each test run to be a sample. The T-Test asks whether the population of timings for a function of sampled in one baseline meaningfully differ from those sampled from a different one. If they are found to be different (ie, if the 95% confidence interval of their difference is entirely positive or negative), their T-Test results are included in a {baseline1}-{baseline2}-tstat.json file in the baseline2 directory and their summary is output to the console. The output file will additionally include timing information for any added function calls sampled in baseline2 but not baseline1, and any dropped function calls sampled in baseline1 but missing from baseline2.

Comparison can be conifugred by included parameters to the npm script. A --baseline option can be included to specify the baseline to compare from, and a --current option can be included to specify the baseline to compare to. npm run perf-tstats is equivalent to npm run perf-tstats -- --baseline baseline --current current.