Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

GH-100982: Break upCOMPARE_AND_BRANCH#102801

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 ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Merged
brandtbucher merged 15 commits intopython:mainfrombrandtbucher:compare-and-not-branch
Mar 23, 2023

Conversation

brandtbucher
Copy link
Member

@brandtbucherbrandtbucher commentedMar 17, 2023
edited
Loading

COMPARE_AND_BRANCH (and its specializations) are a bit weird. It's basically an "adaptive superinstruction" that's present inco_code, and its semantics and lifecycle are different from that of any other instruction. Not only can it be harder to reason about, but it also makes changes (like quickening in the compiler) more awkward.

However, it appears to be only a small improvement overCOMPARE_OP. This branch replaces theCOMPARE_AND_BRANCH family with a "normal"COMPARE_OP one; here are some microbenchmarks for specializations with and without conditional jumps (non-debug, non-PGO):

main:

$ ./python -m timeit -s "x = 0.0" "x == x"20000000 loops, best of 5: 12.7 nsec per loop$ ./python -m timeit -s "x = 0" "x == x"20000000 loops, best of 5: 11 nsec per loop$ ./python -m timeit -s "x = '0'" "x == x"20000000 loops, best of 5: 11.2 nsec per loop$ ./python -m timeit -s "x = 0.0" "None if x == x else None"20000000 loops, best of 5: 10.8 nsec per loop$ ./python -m timeit -s "x = 0" "None if x == x else None"20000000 loops, best of 5: 11.4 nsec per loop$ ./python -m timeit -s "x = '0'" "None if x == x else None"20000000 loops, best of 5: 11.3 nsec per loop

This branch:

$ ./python -m timeit -s "x = 0.0" "x == x"50000000 loops, best of 5: 8.76 nsec per loop$ ./python -m timeit -s "x = 0" "x == x"50000000 loops, best of 5: 8.89 nsec per loop$ ./python -m timeit -s "x = '0'" "x == x"50000000 loops, best of 5: 8.83 nsec per loop$ ./python -m timeit -s "x = 0.0" "None if x == x else None"20000000 loops, best of 5: 11.6 nsec per loop$ ./python -m timeit -s "x = 0" "None if x == x else None"20000000 loops, best of 5: 11.8 nsec per loop$ ./python -m timeit -s "x = '0'" "None if x == x else None"20000000 loops, best of 5: 12 nsec per loop

SoCOMPARE_AND_BRANCH only gets us a <1ns improvement in the (common) branching case, and it costs us about 2-4ns in the (uncommon) non-branching case. Honestly, I don't think that's enough of a win.

(Benchmarks areslightly slower, but in the noise.)

Copy link
Member

@markshannonmarkshannon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Looks good.

@brandtbucherbrandtbucher merged commit0444ae2 intopython:mainMar 23, 2023
Fidget-Spinner pushed a commit to Fidget-Spinner/cpython that referenced this pull requestMar 27, 2023
warsaw pushed a commit to warsaw/cpython that referenced this pull requestApr 11, 2023
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Reviewers

@markshannonmarkshannonmarkshannon approved these changes

@iritkatrieliritkatrielAwaiting requested review from iritkatrieliritkatriel is a code owner

Assignees

@brandtbucherbrandtbucher

Labels
interpreter-core(Objects, Python, Grammar, and Parser dirs)performancePerformance or resource usage
Projects
None yet
Milestone
No milestone
Development

Successfully merging this pull request may close these issues.

3 participants
@brandtbucher@markshannon@bedevere-bot

[8]ページ先頭

©2009-2025 Movatter.jp