• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

aio-libs / multidict / 36255949632
87%

Build:
DEFAULT BRANCH: master
Ran 26 Sep 2026 04:35PM UTC
Jobs 1
Files 44
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

26 Sep 2026 04:34PM UTC coverage: 87.109%. Remained the same
36255949632

push

github

web-flow
Keep slot-level operations out of line (#1600)

<!-- Thank you for your contribution! -->

## What do these changes do?

`_multidict.c` and every `_multilib` header form one translation unit,
and GCC caps how much the whole unit may grow through inlining
(`inline-unit-growth`, 40%). `-fopt-info-inline` shows the cap refusing
98 call sites on the GIL build and 662 on the free-threaded one, so
unrelated edits keep moving these decisions (#1601 fixed one such case
on the insert path).

This marks `NOINLINE` the operations that sit behind Python slots
(`md_replace()`, `md_del()`, `md_repr()`) and the bulk update loops
(`md_update_from_dict/ht/seq()`, `md_extend_self()`). Otherwise they
compete with the hot paths for the budget, and freed budget goes to
inlining them into a slot such as `mp_ass_subscript`, where `delitem`
then pays `md_replace()`'s register saves. The bulk loops are refused
today anyway, so for them the attribute only pins the current layout.

It uses only the existing `NOINLINE` macro, which also works on MSVC,
with no build flags. The pure-Python implementation has nothing
equivalent.

Instructions per operation on 3.14.7t against master 8708f36 (Callgrind,
`benchmarks/callgrind_driver.py`), rows that moved at least 1%. On
3.14.7 no row moved 1% or more.

| operation | `MultiDict` | `CIMultiDict` |
|---|---:|---:|
| `getitem_hit` | 246 -> 234 (-4.9%) | 296 -> 286 (-3.4%) |
| `get_miss` | 380 -> 371 (-2.4%) | 419 -> 412 (-1.7%) |
| `contains_hit` | 195 -> 195 | 250 -> 247 (-1.2%) |
| `setitem_replace` | 511 -> 505 (-1.2%) | 562 -> 556 (-1.1%) |
| `pop` | 549 -> 538 (-2.0%) | 600 -> 586 (-2.3%) |
| `popitem` | 677 -> 665 (-1.8%) | 1,728 -> 1,716 (-0.7%) |
| `ctor_empty` | 893 -> 878 (-1.7%) | 981 -> 966 (-1.5%) |
| `ctor_items` | 70,308 -> 69,893 (-0.6%) | 81,336 -> 80,321 (-1.2%) |

## Are there changes in behavior for the user?

No.

## Is it a substantial burden for the maintainers to support this?

No, these are annotations.

## Relate... (continued)

781 of 1562 branches covered (50.0%)

Branch coverage included in aggregate %.

8213 of 8763 relevant lines covered (93.72%)

1.87 hits per line

Jobs
ID Job ID Ran Files Coverage
1 MyPy - 36255949632.1 26 Sep 2026 04:35PM UTC 88
87.11
GitHub Action Run
Source Files on build 36255949632
  • Tree
  • List 44
  • Changed 2
  • Source Changed 0
  • Coverage Changed 2
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #36255949632
  • d66879bf on github
  • Prev Build on master (#36254418343)
  • Next Build on master (#36257552798)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc