microsoft / microsoft/STL

Optimize `stacktrace` by avoid large allocation

Open
#3,859 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

performance
Dominant language
C++
Stars
11.1k
Forks
1.7k
Avg merge
4d 15h
Merged PRs (30d)
22

Description

@achabense observed that pre-initializing internal vector in stacktrace to the maximum possible depth has noticeable performance impact:

https://github.com/microsoft/STL/blob/2261f7edb760eb3fe0726187c818b796dc7ea798/stl/inc/stacktrace#L142
https://github.com/microsoft/STL/blob/2261f7edb760eb3fe0726187c818b796dc7ea798/stl/inc/stacktrace#L303

The CaptureStackBackTrace API does not have a way for determining the needed amount in advance.

Currently we don't maintain own array management in stacktrace and using vector to avoid dealing in one more place with:

  • copying/moving/assignments
  • allocators
  • ASan

What could we do:

  • @AlexGuteniev suggested that we can create a secret constructor for vector without initialization.
  • @StephanTLavavej suggested we can use smaller allocation on stack, and then try maximum if smaller overflow, otherwise copy data from the stack and not allocate large amount. Smaller could be 32 entries, which is 32*sizeof(void*) bytes,
  • @strega-nil-ms suggested we could start with smaller allocations and grow in a geometric progression

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at stl/inc/stacktrace around the referenced lines and review how CaptureStackBackTrace fills the vector. Compare the proposed smaller-stack, geometric-growth, or uninitialized-vector approaches; done means avoiding maximum-size initialization while preserving copying, moving, assignment, allocator, and ASan behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
performance
Issue type
Refactor
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.