Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Benchmark tests for Build #1026

Merged
merged 4 commits into from
Jan 27, 2021
Merged

Add Benchmark tests for Build #1026

merged 4 commits into from
Jan 27, 2021

Conversation

dfreilich
Copy link
Member

Summary

  • Adds a test for a trusted builder, and an untrusted builder, as well as a make command (make benchmark) to run the benchmark
  • In order to have the output files written to the out directory, I have to ensure that it was created previously, otherwise -memprofile will cause it to error out. As such, I adapted the out target to use Windows compliant functionality for creating the output directory.
  • I have steered away from using the -outputdir option, because I found that it would frequently error out if the files didn't exist previously, which is a departure from the typical -memprofile and -cpuprofile options.

Requirements: To utilize some of the graphical aspects of go tool pprof, you need to have graphviz installed.

Signed-off-by: David Freilich dfreilich@vmware.com

Output

Sample output of

$  go tool pprof benchmarks.test out/bench_cpu.out
File: benchmarks.test
Type: cpu
Time: Jan 19, 2021 at 11:59am (IST)
Duration: 37.95s, Total samples = 150ms (  0.4%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) top10
Showing nodes accounting for 140ms, 93.33% of 150ms total
Showing top 10 nodes out of 91
      flat  flat%   sum%        cum   cum%
      30ms 20.00% 20.00%       30ms 20.00%  runtime.nanotime1
      20ms 13.33% 33.33%       20ms 13.33%  runtime.memclrNoHeapPointers
      20ms 13.33% 46.67%       20ms 13.33%  runtime.pthread_cond_wait
      10ms  6.67% 53.33%       10ms  6.67%  runtime.kevent
      10ms  6.67% 60.00%       10ms  6.67%  runtime.nextFreeFast
      10ms  6.67% 66.67%       10ms  6.67%  runtime.pageIndexOf
      10ms  6.67% 73.33%       10ms  6.67%  runtime.pthread_cond_signal
      10ms  6.67% 80.00%       10ms  6.67%  runtime.pthread_kill
      10ms  6.67% 86.67%       10ms  6.67%  runtime.usleep
      10ms  6.67% 93.33%       10ms  6.67%  sync.(*Mutex).Lock
(pprof) top10 -cum
Showing nodes accounting for 0, 0% of 150ms total
Showing top 10 nodes out of 91
      flat  flat%   sum%        cum   cum%
         0     0%     0%       50ms 33.33%  runtime.findrunnable
         0     0%     0%       50ms 33.33%  runtime.mcall
         0     0%     0%       50ms 33.33%  runtime.schedule
         0     0%     0%       40ms 26.67%  github.com/buildpacks/pack.(*Client).Build
         0     0%     0%       40ms 26.67%  github.com/buildpacks/pack/internal/commands.Build.func1
         0     0%     0%       40ms 26.67%  github.com/buildpacks/pack/internal/commands.logError.func1
         0     0%     0%       40ms 26.67%  github.com/buildpacks/pack/internal/image.(*Fetcher).Fetch
         0     0%     0%       40ms 26.67%  github.com/spf13/cobra.(*Command).Execute
         0     0%     0%       40ms 26.67%  github.com/spf13/cobra.(*Command).ExecuteC
         0     0%     0%       40ms 26.67%  github.com/spf13/cobra.(*Command).execute
(pprof) list DFS
Total: 150ms
(pprof) list Build
Total: 150ms
ROUTINE ======================== github.com/buildpacks/pack.(*Client).Build in /Users/dfreilich/workspace/pack/build.go
         0       40ms (flat, cum) 26.67% of Total
         .          .    200:	builderRef, err := c.processBuilderName(opts.Builder)
         .          .    201:	if err != nil {
         .          .    202:		return errors.Wrapf(err, "invalid builder '%s'", opts.Builder)
         .          .    203:	}
         .          .    204:
         .       20ms    205:	rawBuilderImage, err := c.imageFetcher.Fetch(ctx, builderRef.Name(), true, opts.PullPolicy)
         .          .    206:	if err != nil {
         .          .    207:		return errors.Wrapf(err, "failed to fetch builder image '%s'", builderRef.Name())
         .          .    208:	}
         .          .    209:
         .          .    210:	bldr, err := c.getBuilder(rawBuilderImage)
         .          .    211:	if err != nil {
         .          .    212:		return errors.Wrapf(err, "invalid builder %s", style.Symbol(opts.Builder))
         .          .    213:	}
         .          .    214:
         .          .    215:	runImageName := c.resolveRunImage(opts.RunImage, imageRef.Context().RegistryStr(), builderRef.Context().RegistryStr(), bldr.Stack(), opts.AdditionalMirrors, opts.Publish)
         .       20ms    216:	runImage, err := c.validateRunImage(ctx, runImageName, opts.PullPolicy, opts.Publish, bldr.StackID)
         .          .    217:	if err != nil {
         .          .    218:		return errors.Wrapf(err, "invalid run-image '%s'", runImageName)
         .          .    219:	}
         .          .    220:
         .          .    221:	var runMixins []string
ROUTINE ======================== github.com/buildpacks/pack/benchmarks.BenchmarkBuild.func1 in /Users/dfreilich/workspace/pack/benchmarks/build_test.go
         0       20ms (flat, cum) 13.33% of Total
         .          .     40:
         .          .     41:	b.Run("with Untrusted Builder", func(b *testing.B) {
         .          .     42:		for i := 0; i < b.N; i++ {
         .          .     43:			// perform the operation we're analyzing
         .          .     44:			cmd.SetArgs([]string{fmt.Sprintf("%s%d", baseImg, i), "-p", mockAppPath, "-B", builder})
         .       20ms     45:			if err = cmd.Execute(); err != nil {
         .          .     46:				b.Error(errors.Wrapf(err, "running build #%d", i))
         .          .     47:			}
         .          .     48:		}
         .          .     49:	})
         .          .     50:
ROUTINE ======================== github.com/buildpacks/pack/benchmarks.BenchmarkBuild.func2 in /Users/dfreilich/workspace/pack/benchmarks/build_test.go
         0       20ms (flat, cum) 13.33% of Total
         .          .     50:
         .          .     51:	b.Run("with Trusted Builder", func(b *testing.B) {
         .          .     52:		for i := 0; i < b.N; i++ {
         .          .     53:			// perform the operation we're analyzing
         .          .     54:			cmd.SetArgs([]string{fmt.Sprintf("%s%d", trustedImg, i), "-p", mockAppPath, "-B", builder, "--trust-builder"})
         .       20ms     55:			if err = cmd.Execute(); err != nil {
         .          .     56:				b.Error(errors.Wrapf(err, "running build #%d", i))
         .          .     57:			}
         .          .     58:		}
         .          .     59:	})
         .          .     60:
ROUTINE ======================== github.com/buildpacks/pack/internal/commands.Build.func1 in /Users/dfreilich/workspace/pack/internal/commands/build.go
         0       40ms (flat, cum) 26.67% of Total
         .          .     95:			pullPolicy, err := pubcfg.ParsePullPolicy(stringPolicy)
         .          .     96:			if err != nil {
         .          .     97:				return errors.Wrapf(err, "parsing pull policy %s", flags.Policy)
         .          .     98:			}
         .          .     99:
         .       40ms    100:			if err := packClient.Build(cmd.Context(), pack.BuildOptions{
         .          .    101:				AppPath:           flags.AppPath,
         .          .    102:				Builder:           flags.Builder,
         .          .    103:				Registry:          flags.Registry,
         .          .    104:				AdditionalMirrors: getMirrors(cfg),
         .          .    105:				AdditionalTags:    flags.AdditionalTags,
$  go tool pprof benchmarks.test out/bench_mem.out
File: benchmarks.test
Type: alloc_space
Time: Jan 19, 2021 at 12:00pm (IST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) top10
Showing nodes accounting for 6614.97kB, 100% of 6614.97kB total
Showing top 10 nodes out of 102
      flat  flat%   sum%        cum   cum%
 2123.69kB 32.10% 32.10%  2123.69kB 32.10%  bytes.makeSlice
  902.59kB 13.64% 45.75%   902.59kB 13.64%  compress/flate.NewWriter
     514kB  7.77% 53.52%      514kB  7.77%  bufio.(*Scanner).Scan
  513.50kB  7.76% 61.28%   513.50kB  7.76%  runtime/pprof.(*protobuf).varint
  512.44kB  7.75% 69.03%   512.44kB  7.75%  reflect.mapassign
  512.28kB  7.74% 76.77%   512.28kB  7.74%  github.com/buildpacks/pack/internal/builder.constructBuilder
  512.25kB  7.74% 84.52%   512.25kB  7.74%  crypto/x509.parseSANExtension.func1
  512.22kB  7.74% 92.26%   512.22kB  7.74%  reflect.unsafe_NewArray
  512.01kB  7.74%   100%   512.01kB  7.74%  reflect.(*structType).Field
         0     0%   100%  1606.92kB 24.29%  bytes.(*Buffer).ReadFrom
(pprof) top10 -cum
Showing nodes accounting for 2.07MB, 32.10% of 6.46MB total
Showing top 10 nodes out of 102
      flat  flat%   sum%        cum   cum%
         0     0%     0%     2.51MB 38.84%  github.com/buildpacks/pack.(*Client).Build
         0     0%     0%     2.51MB 38.84%  github.com/buildpacks/pack/benchmarks.BenchmarkBuild.func1
         0     0%     0%     2.51MB 38.84%  github.com/buildpacks/pack/internal/commands.Build.func1
         0     0%     0%     2.51MB 38.84%  github.com/buildpacks/pack/internal/commands.logError.func1
         0     0%     0%     2.51MB 38.84%  github.com/spf13/cobra.(*Command).Execute (inline)
         0     0%     0%     2.51MB 38.84%  github.com/spf13/cobra.(*Command).ExecuteC
         0     0%     0%     2.51MB 38.84%  github.com/spf13/cobra.(*Command).execute
         0     0%     0%     2.07MB 32.10%  bytes.(*Buffer).grow
    2.07MB 32.10% 32.10%     2.07MB 32.10%  bytes.makeSlice
         0     0% 32.10%     2.01MB 31.10%  testing.(*B).run1.func1
(pprof) list Build
Total: 6.46MB
ROUTINE ======================== github.com/buildpacks/pack.(*Client).Build in /Users/dfreilich/workspace/pack/build.go
         0     2.51MB (flat, cum) 38.84% of Total
         .          .    200:	builderRef, err := c.processBuilderName(opts.Builder)
         .          .    201:	if err != nil {
         .          .    202:		return errors.Wrapf(err, "invalid builder '%s'", opts.Builder)
         .          .    203:	}
         .          .    204:
         .        1MB    205:	rawBuilderImage, err := c.imageFetcher.Fetch(ctx, builderRef.Name(), true, opts.PullPolicy)
         .          .    206:	if err != nil {
         .          .    207:		return errors.Wrapf(err, "failed to fetch builder image '%s'", builderRef.Name())
         .          .    208:	}
         .          .    209:
         .          .    210:	bldr, err := c.getBuilder(rawBuilderImage)
         .          .    211:	if err != nil {
         .          .    212:		return errors.Wrapf(err, "invalid builder %s", style.Symbol(opts.Builder))
         .          .    213:	}
         .          .    214:
         .          .    215:	runImageName := c.resolveRunImage(opts.RunImage, imageRef.Context().RegistryStr(), builderRef.Context().RegistryStr(), bldr.Stack(), opts.AdditionalMirrors, opts.Publish)
         .          .    216:	runImage, err := c.validateRunImage(ctx, runImageName, opts.PullPolicy, opts.Publish, bldr.StackID)
         .          .    217:	if err != nil {
         .          .    218:		return errors.Wrapf(err, "invalid run-image '%s'", runImageName)
         .          .    219:	}
         .          .    220:
         .          .    221:	var runMixins []string
         .          .    222:	if _, err := dist.GetLabel(runImage, stack.MixinsLabel, &runMixins); err != nil {
         .          .    223:		return err
         .          .    224:	}
         .          .    225:
         .          .    226:	fetchedBPs, order, err := c.processBuildpacks(ctx, bldr.Image(), bldr.Buildpacks(), bldr.Order(), opts)
         .          .    227:	if err != nil {
         .          .    228:		return err
         .          .    229:	}
         .          .    230:
         .   512.44kB    231:	if err := c.validateMixins(fetchedBPs, bldr, runImageName, runMixins); err != nil {
         .          .    232:		return errors.Wrap(err, "validating stack mixins")
         .          .    233:	}
         .          .    234:
         .          .    235:	buildEnvs := map[string]string{}
         .          .    236:	for _, envVar := range opts.ProjectDescriptor.Build.Env {
         .          .    237:		buildEnvs[envVar.Name] = envVar.Value
         .          .    238:	}
         .          .    239:
         .          .    240:	for k, v := range opts.Env {
         .          .    241:		buildEnvs[k] = v
         .          .    242:	}
         .          .    243:
         .        1MB    244:	ephemeralBuilder, err := c.createEphemeralBuilder(rawBuilderImage, buildEnvs, order, fetchedBPs)
         .          .    245:	if err != nil {
         .          .    246:		return err
         .          .    247:	}
         .          .    248:	defer c.docker.ImageRemove(context.Background(), ephemeralBuilder.Name(), types.ImageRemoveOptions{Force: true})
         .          .    249:
ROUTINE ======================== github.com/buildpacks/pack.(*Client).createEphemeralBuilder in /Users/dfreilich/workspace/pack/build.go
         0        1MB (flat, cum) 15.56% of Total
         .          .    803:	return nil
         .          .    804:}
         .          .    805:
         .          .    806:func (c *Client) createEphemeralBuilder(rawBuilderImage imgutil.Image, env map[string]string, order dist.Order, buildpacks []dist.Buildpack) (*builder.Builder, error) {
         .          .    807:	origBuilderName := rawBuilderImage.Name()
         .   512.28kB    808:	bldr, err := builder.New(rawBuilderImage, fmt.Sprintf("pack.local/builder/%x:latest", randString(10)))
         .          .    809:	if err != nil {
         .          .    810:		return nil, errors.Wrapf(err, "invalid builder %s", style.Symbol(origBuilderName))
         .          .    811:	}
         .          .    812:
         .          .    813:	bldr.SetEnv(env)
         .          .    814:	for _, bp := range buildpacks {
         .          .    815:		bpInfo := bp.Descriptor().Info
         .          .    816:		c.logger.Debugf("Adding buildpack %s version %s to builder", style.Symbol(bpInfo.ID), style.Symbol(bpInfo.Version))
         .          .    817:		bldr.AddBuildpack(bp)
         .          .    818:	}
         .          .    819:	if len(order) > 0 && len(order[0].Group) > 0 {
         .          .    820:		c.logger.Debug("Setting custom order")
         .          .    821:		bldr.SetOrder(order)
         .          .    822:	}
         .          .    823:
         .   516.76kB    824:	if err := bldr.Save(c.logger, builder.CreatorMetadata{Version: Version}); err != nil {
         .          .    825:		return nil, err
         .          .    826:	}
         .          .    827:	return bldr, nil
         .          .    828:}
         .          .    829:
ROUTINE ======================== github.com/buildpacks/pack.allBuildpacks in /Users/dfreilich/workspace/pack/build.go
         0   512.44kB (flat, cum)  7.75% of Total
         .          .    471:// allBuildpacks aggregates all buildpacks declared on the image with additional buildpacks passed in. They are sorted
         .          .    472:// by ID then Version.
         .          .    473:func allBuildpacks(builderImage imgutil.Image, additionalBuildpacks []dist.Buildpack) ([]dist.BuildpackDescriptor, error) {
         .          .    474:	var all []dist.BuildpackDescriptor
         .          .    475:	var bpLayers dist.BuildpackLayers
         .   512.44kB    476:	if _, err := dist.GetLabel(builderImage, dist.BuildpackLayersLabel, &bpLayers); err != nil {
         .          .    477:		return nil, err
         .          .    478:	}
         .          .    479:	for id, bps := range bpLayers {
         .          .    480:		for ver, bp := range bps {
         .          .    481:			desc := dist.BuildpackDescriptor{
ROUTINE ======================== github.com/buildpacks/pack/benchmarks.BenchmarkBuild.func1 in /Users/dfreilich/workspace/pack/benchmarks/build_test.go
         0     2.51MB (flat, cum) 38.84% of Total
         .          .     40:
         .          .     41:	b.Run("with Untrusted Builder", func(b *testing.B) {
         .          .     42:		for i := 0; i < b.N; i++ {
         .          .     43:			// perform the operation we're analyzing
         .          .     44:			cmd.SetArgs([]string{fmt.Sprintf("%s%d", baseImg, i), "-p", mockAppPath, "-B", builder})
         .     2.51MB     45:			if err = cmd.Execute(); err != nil {
         .          .     46:				b.Error(errors.Wrapf(err, "running build #%d", i))
         .          .     47:			}
         .          .     48:		}
         .          .     49:	})
         .          .     50:
ROUTINE ======================== github.com/buildpacks/pack/internal/builder.(*Builder).Save in /Users/dfreilich/workspace/pack/internal/builder/builder.go
         0   516.76kB (flat, cum)  7.81% of Total
         .          .    387:
         .          .    388:	if err := b.image.SetWorkingDir(layersDir); err != nil {
         .          .    389:		return errors.Wrap(err, "failed to set working dir")
         .          .    390:	}
         .          .    391:
         .   516.76kB    392:	return b.image.Save()
         .          .    393:}
         .          .    394:
         .          .    395:// Helpers
         .          .    396:
         .          .    397:func processOrder(buildpacks []dist.BuildpackInfo, order dist.Order) (dist.Order, error) {
ROUTINE ======================== github.com/buildpacks/pack/internal/builder.constructBuilder in /Users/dfreilich/workspace/pack/internal/builder/builder.go
  512.28kB   512.28kB (flat, cum)  7.74% of Total
         .          .     96:	layerWriterFactory, err := layer.NewWriterFactory(imageOS)
         .          .     97:	if err != nil {
         .          .     98:		return nil, err
         .          .     99:	}
         .          .    100:
  512.28kB   512.28kB    101:	bldr := &Builder{
         .          .    102:		baseImageName:       img.Name(),
         .          .    103:		image:               img,
         .          .    104:		layerWriterFactory:  layerWriterFactory,
         .          .    105:		metadata:            metadata,
         .          .    106:		lifecycleDescriptor: constructLifecycleDescriptor(metadata),
ROUTINE ======================== github.com/buildpacks/pack/internal/commands.Build.func1 in /Users/dfreilich/workspace/pack/internal/commands/build.go
         0     2.51MB (flat, cum) 38.84% of Total
         .          .     95:			pullPolicy, err := pubcfg.ParsePullPolicy(stringPolicy)
         .          .     96:			if err != nil {
         .          .     97:				return errors.Wrapf(err, "parsing pull policy %s", flags.Policy)
         .          .     98:			}
         .          .     99:
         .     2.51MB    100:			if err := packClient.Build(cmd.Context(), pack.BuildOptions{
         .          .    101:				AppPath:           flags.AppPath,
         .          .    102:				Builder:           flags.Builder,
         .          .    103:				Registry:          flags.Registry,
         .          .    104:				AdditionalMirrors: getMirrors(cfg),
         .          .    105:				AdditionalTags:    flags.AdditionalTags,
ROUTINE ======================== runtime/pprof.(*profileBuilder).appendLocsForStack in /usr/local/Cellar/go/1.14.5/libexec/src/runtime/pprof/proto.go
         0   513.50kB (flat, cum)  7.76% of Total
         .          .    425:			continue
         .          .    426:		}
         .          .    427:		// add failed because this addr is not inlined with the
         .          .    428:		// existing PCs in the deck. Flush the deck and retry handling
         .          .    429:		// this pc.
         .   513.50kB    430:		if id := b.emitLocation(); id > 0 {
         .          .    431:			locs = append(locs, id)
         .          .    432:		}
         .          .    433:
         .          .    434:		// check cache again - previous emitLocation added a new entry
         .          .    435:		if l, ok := b.locs[addr]; ok {
ROUTINE ======================== runtime/pprof.(*profileBuilder).build in /usr/local/Cellar/go/1.14.5/libexec/src/runtime/pprof/proto.go
         0     1.38MB (flat, cum) 21.41% of Total
         .          .    360:					b.pbLabel(tagSample_Label, k, v, 0)
         .          .    361:				}
         .          .    362:			}
         .          .    363:		}
         .          .    364:
         .   513.50kB    365:		locs = b.appendLocsForStack(locs[:0], e.stk)
         .          .    366:
         .          .    367:		b.pbSample(values, locs, labels)
         .          .    368:	}
         .          .    369:
         .          .    370:	for i, m := range b.mem {
         .          .    371:		hasFunctions := m.funcs == lookupTried // lookupTried but not lookupFailed
         .          .    372:		b.pbMapping(tagProfile_Mapping, uint64(i+1), uint64(m.start), uint64(m.end), m.offset, m.file, m.buildID, hasFunctions)
         .          .    373:	}
         .          .    374:
         .          .    375:	// TODO: Anything for tagProfile_DropFrames?
         .          .    376:	// TODO: Anything for tagProfile_KeepFrames?
         .          .    377:
         .          .    378:	b.pb.strings(tagProfile_StringTable, b.strings)
         .   902.59kB    379:	b.zw.Write(b.pb.data)
         .          .    380:	b.zw.Close()
         .          .    381:}
         .          .    382:
         .          .    383:// appendLocsForStack appends the location IDs for the given stack trace to the given
         .          .    384:// location ID slice, locs. The addresses in the stack are return PCs or 1 + the PC of
ROUTINE ======================== runtime/pprof.(*profileBuilder).emitLocation in /usr/local/Cellar/go/1.14.5/libexec/src/runtime/pprof/proto.go
         0   513.50kB (flat, cum)  7.76% of Total
         .          .    541:		if funcID == 0 {
         .          .    542:			funcID = uint64(len(b.funcs)) + 1
         .          .    543:			b.funcs[frame.Function] = int(funcID)
         .          .    544:			newFuncs = append(newFuncs, newFunc{funcID, frame.Function, frame.File})
         .          .    545:		}
         .   513.50kB    546:		b.pbLine(tagLocation_Line, funcID, int64(frame.Line))
         .          .    547:	}
         .          .    548:	for i := range b.mem {
         .          .    549:		if b.mem[i].start <= addr && addr < b.mem[i].end || b.mem[i].fake {
         .          .    550:			b.pb.uint64Opt(tagLocation_MappingID, uint64(i+1))
         .          .    551:
ROUTINE ======================== runtime/pprof.(*profileBuilder).pbLine in /usr/local/Cellar/go/1.14.5/libexec/src/runtime/pprof/proto.go
         0   513.50kB (flat, cum)  7.76% of Total
         .          .    182:// pbLine encodes a Line message to b.pb.
         .          .    183:func (b *profileBuilder) pbLine(tag int, funcID uint64, line int64) {
         .          .    184:	start := b.pb.startMessage()
         .          .    185:	b.pb.uint64Opt(tagLine_FunctionID, funcID)
         .          .    186:	b.pb.int64Opt(tagLine_Line, line)
         .   513.50kB    187:	b.pb.endMessage(tag, start)
         .          .    188:}
         .          .    189:
         .          .    190:// pbMapping encodes a Mapping message to b.pb.
         .          .    191:func (b *profileBuilder) pbMapping(tag int, id, base, limit, offset uint64, file, buildID string, hasFuncs bool) {
         .          .    192:	start := b.pb.startMessage()

Documentation

  • Should this change be documented?
    • Yes, in our Development document

Related

@dfreilich dfreilich requested a review from a team as a code owner January 19, 2021 10:17
@dfreilich dfreilich closed this Jan 22, 2021
@dfreilich dfreilich reopened this Jan 22, 2021
* Adds a test for a trusted builder, and an untrusted builder, as well as a make command (make benchmark) to run the benchmark
* In order to have the output files written to the out directory, I
  havae to ensure that it was created previously, otherwise -memprofile
  will cause it to error out. As such, I adapted the out target to use
  Windows compliant functionality for creating the output directory.

  * I have steered away from using the -outputdir option, because I
    found that it would frequently error out if the files didn't exist
    previously, which is a departure from the typical -memprofile and
    -cpuprofile options.

Signed-off-by: David Freilich <dfreilich@vmware.com>
Remove ! operator, and use then else to take advantage of switching on out dir existence.

Signed-off-by: David Freilich <dfreilich@vmware.com>
Signed-off-by: David Freilich <dfreilich@vmware.com>
@github-actions github-actions bot added this to the 0.17.0 milestone Jan 22, 2021
@github-actions github-actions bot added the type/enhancement Issue that requests a new feature or improvement. label Jan 22, 2021
@dfreilich dfreilich added type/chore Issue that requests non-user facing changes. and removed type/enhancement Issue that requests a new feature or improvement. labels Jan 22, 2021
@codecov
Copy link

codecov bot commented Jan 22, 2021

Codecov Report

Merging #1026 (e69826c) into main (759dbe9) will decrease coverage by 0.02%.
The diff coverage is n/a.

Impacted file tree graph

@@            Coverage Diff             @@
##             main    #1026      +/-   ##
==========================================
- Coverage   80.23%   80.22%   -0.01%     
==========================================
  Files         130      130              
  Lines        7989     7989              
==========================================
- Hits         6409     6408       -1     
- Misses       1160     1161       +1     
  Partials      420      420              
Flag Coverage Δ
os_linux 79.54% <ø> (ø)
os_macos 76.96% <ø> (ø)
os_windows 80.10% <ø> (-0.03%) ⬇️
unit 79.59% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

@github-actions github-actions bot added type/enhancement Issue that requests a new feature or improvement. and removed type/chore Issue that requests non-user facing changes. labels Jan 27, 2021
@dfreilich dfreilich merged commit ddaff10 into main Jan 27, 2021
@dfreilich dfreilich deleted the add-benchmarks branch January 27, 2021 11:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type/enhancement Issue that requests a new feature or improvement.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant