Skip to content

perf(assert): compare assert_within_delta in fixed point, not via bc - #979

Merged
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison
Aug 7, 2026
Merged

perf(assert): compare assert_within_delta in fixed point, not via bc#979
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

assert_within_delta called bashunit::math::calculate twice, and each call is a subshell wrapping a bc (or awk) process — four forks per assertion, on a per-assertion path.

beforeafter
assert_within_delta ×2001092 ms165 ms
fork-free floor108 ms108 ms

💡 Changes

The comparison is |expected - actual| <= delta, which needs no floating point at all. All three operands are padded to one decimal scale and compared as integers, in pure bash.

The fast path is deliberately narrow and refuses what it cannot represent exactly — exponent notation, a sign anywhere but the front, or enough digits to risk 64-bit overflow — so those fall through to the existing bc/awk chain rather than getting a quietly wrong answer.

bashunit::math::is_le gets the same fast path; it had the identical bc > awk > strip-decimals chain for the same reason.

🐛 Also fixes a bug, rather than moving it

_is_numeric accepts a leading +, but bc cannot parse one: +5 - 5 returned an empty string, which compared unequal to "1", so assert_within_delta +5 5 1 failed. The sign is now stripped once before either path — so the fallback is fixed too, not just bypassed.

✅ How agreement was verified

Forcing the fixed-point path to always refuse leaves the entire numeric suite green on the bc/awk path. That's the check that the two paths agree, rather than just that the new one passes.

Slots rather than echoes for the three helpers — not stylistic: the caller needs the decimal count three times per assertion, and three $( ) captures would cost more than the two bc forks this change exists to remove.

🔒 Verification

Bash 3.0 safe — parameter expansion, case and integer arithmetic only; compat gate green (14/14). Fork budgets unchanged. make sa · make lint · bash build.sh bin -v✅ Build verified ✅ · 1661 sequential / 1620 parallel-simple-strict.

assert_within_delta called bashunit::math::calculate twice, and each call is a
subshell wrapping a `bc` (or `awk`) process. Four forks per assertion on a
per-assertion path: 200 calls took 1092ms where the fork-free floor is ~108ms.
They now take 165ms.
The comparison is |expected - actual| <= delta, which needs no floating point at
all. All three operands are padded to one decimal scale and compared as
integers, in pure bash.
The fast path is deliberately narrow and refuses what it cannot represent
exactly -- exponent notation, a sign anywhere but the front, or enough digits to
risk 64-bit overflow -- so those fall through to the existing bc/awk chain
rather than getting a quietly wrong answer. Both paths were run against the full
numeric suite: forcing the fixed-point path to always refuse leaves every test
green, which is the check that they agree.
This also fixes a bug rather than only moving it. _is_numeric accepts a leading
`+`, but bc cannot parse one: `+5 - 5` returned an empty string, which compared
unequal to "1", so `assert_within_delta +5 5 1` failed. The sign is now stripped
once before either path, so the fallback is fixed too and not just bypassed.
bashunit::math::is_le gets the same fast path; it had the identical bc > awk >
strip-decimals chain for the same reason.
The three helpers return through slots rather than echoing. That is not
stylistic here: the caller needs the decimal count three times per assertion,
and three `$( )` captures would cost more than the two bc forks the whole change
exists to remove.
Bash 3.0 safe: parameter expansion, `case` and integer arithmetic only. Fork
budgets unchanged; compat gate green; 1661 sequential / 1620 parallel.
@ChemaclassChemaclass added the enhancement New feature or request label Aug 6, 2026
@ChemaclassChemaclass self-assigned this Aug 6, 2026
@Chemaclass

Copy link
Copy Markdown
MemberAuthor

Reopening to re-trigger CI; no pull_request runs were created.

@ChemaclassChemaclass reopened this Aug 6, 2026
@Chemaclass
Chemaclassforce-pushed the perf/fixed-point-numeric-comparison branch from bc0e872 to 9608465CompareAugust 6, 2026 19:54
@Chemaclass
Chemaclass merged commit 5b31658 into mainAug 7, 2026
37 checks passed
@Chemaclass
Chemaclass deleted the perf/fixed-point-numeric-comparison branch August 7, 2026 10:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
perf(assert): compare assert_within_delta in fixed point, not via bc by Chemaclass · Pull Request #979 · TypedDevs/bashunit · GitHub
Skip to content

perf(assert): compare assert_within_delta in fixed point, not via bc - #979

Merged
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison
Aug 7, 2026
Merged

perf(assert): compare assert_within_delta in fixed point, not via bc#979
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

assert_within_delta called bashunit::math::calculate twice, and each call is a subshell wrapping a bc (or awk) process — four forks per assertion, on a per-assertion path.

beforeafter
assert_within_delta ×2001092 ms165 ms
fork-free floor108 ms108 ms

💡 Changes

The comparison is |expected - actual| <= delta, which needs no floating point at all. All three operands are padded to one decimal scale and compared as integers, in pure bash.

The fast path is deliberately narrow and refuses what it cannot represent exactly — exponent notation, a sign anywhere but the front, or enough digits to risk 64-bit overflow — so those fall through to the existing bc/awk chain rather than getting a quietly wrong answer.

bashunit::math::is_le gets the same fast path; it had the identical bc > awk > strip-decimals chain for the same reason.

🐛 Also fixes a bug, rather than moving it

_is_numeric accepts a leading +, but bc cannot parse one: +5 - 5 returned an empty string, which compared unequal to "1", so assert_within_delta +5 5 1 failed. The sign is now stripped once before either path — so the fallback is fixed too, not just bypassed.

✅ How agreement was verified

Forcing the fixed-point path to always refuse leaves the entire numeric suite green on the bc/awk path. That's the check that the two paths agree, rather than just that the new one passes.

Slots rather than echoes for the three helpers — not stylistic: the caller needs the decimal count three times per assertion, and three $( ) captures would cost more than the two bc forks this change exists to remove.

🔒 Verification

Bash 3.0 safe — parameter expansion, case and integer arithmetic only; compat gate green (14/14). Fork budgets unchanged. make sa · make lint · bash build.sh bin -v✅ Build verified ✅ · 1661 sequential / 1620 parallel-simple-strict.

assert_within_delta called bashunit::math::calculate twice, and each call is a
subshell wrapping a `bc` (or `awk`) process. Four forks per assertion on a
per-assertion path: 200 calls took 1092ms where the fork-free floor is ~108ms.
They now take 165ms.
The comparison is |expected - actual| <= delta, which needs no floating point at
all. All three operands are padded to one decimal scale and compared as
integers, in pure bash.
The fast path is deliberately narrow and refuses what it cannot represent
exactly -- exponent notation, a sign anywhere but the front, or enough digits to
risk 64-bit overflow -- so those fall through to the existing bc/awk chain
rather than getting a quietly wrong answer. Both paths were run against the full
numeric suite: forcing the fixed-point path to always refuse leaves every test
green, which is the check that they agree.
This also fixes a bug rather than only moving it. _is_numeric accepts a leading
`+`, but bc cannot parse one: `+5 - 5` returned an empty string, which compared
unequal to "1", so `assert_within_delta +5 5 1` failed. The sign is now stripped
once before either path, so the fallback is fixed too and not just bypassed.
bashunit::math::is_le gets the same fast path; it had the identical bc > awk >
strip-decimals chain for the same reason.
The three helpers return through slots rather than echoing. That is not
stylistic here: the caller needs the decimal count three times per assertion,
and three `$( )` captures would cost more than the two bc forks the whole change
exists to remove.
Bash 3.0 safe: parameter expansion, `case` and integer arithmetic only. Fork
budgets unchanged; compat gate green; 1661 sequential / 1620 parallel.
@ChemaclassChemaclass added the enhancement New feature or request label Aug 6, 2026
@ChemaclassChemaclass self-assigned this Aug 6, 2026
@Chemaclass

Copy link
Copy Markdown
MemberAuthor

Reopening to re-trigger CI; no pull_request runs were created.

@ChemaclassChemaclass reopened this Aug 6, 2026
@Chemaclass
Chemaclassforce-pushed the perf/fixed-point-numeric-comparison branch from bc0e872 to 9608465CompareAugust 6, 2026 19:54
@Chemaclass
Chemaclass merged commit 5b31658 into mainAug 7, 2026
37 checks passed
@Chemaclass
Chemaclass deleted the perf/fixed-point-numeric-comparison branch August 7, 2026 10:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' perf(assert): compare assert_within_delta in fixed point, not via bc by Chemaclass · Pull Request #979 · TypedDevs/bashunit · GitHub
Skip to content

perf(assert): compare assert_within_delta in fixed point, not via bc - #979

Merged
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison
Aug 7, 2026
Merged

perf(assert): compare assert_within_delta in fixed point, not via bc#979
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

assert_within_delta called bashunit::math::calculate twice, and each call is a subshell wrapping a bc (or awk) process — four forks per assertion, on a per-assertion path.

beforeafter
assert_within_delta ×2001092 ms165 ms
fork-free floor108 ms108 ms

💡 Changes

The comparison is |expected - actual| <= delta, which needs no floating point at all. All three operands are padded to one decimal scale and compared as integers, in pure bash.

The fast path is deliberately narrow and refuses what it cannot represent exactly — exponent notation, a sign anywhere but the front, or enough digits to risk 64-bit overflow — so those fall through to the existing bc/awk chain rather than getting a quietly wrong answer.

bashunit::math::is_le gets the same fast path; it had the identical bc > awk > strip-decimals chain for the same reason.

🐛 Also fixes a bug, rather than moving it

_is_numeric accepts a leading +, but bc cannot parse one: +5 - 5 returned an empty string, which compared unequal to "1", so assert_within_delta +5 5 1 failed. The sign is now stripped once before either path — so the fallback is fixed too, not just bypassed.

✅ How agreement was verified

Forcing the fixed-point path to always refuse leaves the entire numeric suite green on the bc/awk path. That's the check that the two paths agree, rather than just that the new one passes.

Slots rather than echoes for the three helpers — not stylistic: the caller needs the decimal count three times per assertion, and three $( ) captures would cost more than the two bc forks this change exists to remove.

🔒 Verification

Bash 3.0 safe — parameter expansion, case and integer arithmetic only; compat gate green (14/14). Fork budgets unchanged. make sa · make lint · bash build.sh bin -v✅ Build verified ✅ · 1661 sequential / 1620 parallel-simple-strict.

assert_within_delta called bashunit::math::calculate twice, and each call is a
subshell wrapping a `bc` (or `awk`) process. Four forks per assertion on a
per-assertion path: 200 calls took 1092ms where the fork-free floor is ~108ms.
They now take 165ms.
The comparison is |expected - actual| <= delta, which needs no floating point at
all. All three operands are padded to one decimal scale and compared as
integers, in pure bash.
The fast path is deliberately narrow and refuses what it cannot represent
exactly -- exponent notation, a sign anywhere but the front, or enough digits to
risk 64-bit overflow -- so those fall through to the existing bc/awk chain
rather than getting a quietly wrong answer. Both paths were run against the full
numeric suite: forcing the fixed-point path to always refuse leaves every test
green, which is the check that they agree.
This also fixes a bug rather than only moving it. _is_numeric accepts a leading
`+`, but bc cannot parse one: `+5 - 5` returned an empty string, which compared
unequal to "1", so `assert_within_delta +5 5 1` failed. The sign is now stripped
once before either path, so the fallback is fixed too and not just bypassed.
bashunit::math::is_le gets the same fast path; it had the identical bc > awk >
strip-decimals chain for the same reason.
The three helpers return through slots rather than echoing. That is not
stylistic here: the caller needs the decimal count three times per assertion,
and three `$( )` captures would cost more than the two bc forks the whole change
exists to remove.
Bash 3.0 safe: parameter expansion, `case` and integer arithmetic only. Fork
budgets unchanged; compat gate green; 1661 sequential / 1620 parallel.
@ChemaclassChemaclass added the enhancement New feature or request label Aug 6, 2026
@ChemaclassChemaclass self-assigned this Aug 6, 2026
@Chemaclass

Copy link
Copy Markdown
MemberAuthor

Reopening to re-trigger CI; no pull_request runs were created.

@ChemaclassChemaclass reopened this Aug 6, 2026
@Chemaclass
Chemaclassforce-pushed the perf/fixed-point-numeric-comparison branch from bc0e872 to 9608465CompareAugust 6, 2026 19:54
@Chemaclass
Chemaclass merged commit 5b31658 into mainAug 7, 2026
37 checks passed
@Chemaclass
Chemaclass deleted the perf/fixed-point-numeric-comparison branch August 7, 2026 10:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' perf(assert): compare assert_within_delta in fixed point, not via bc by Chemaclass · Pull Request #979 · TypedDevs/bashunit · GitHub
Skip to content

perf(assert): compare assert_within_delta in fixed point, not via bc - #979

Merged
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison
Aug 7, 2026
Merged

perf(assert): compare assert_within_delta in fixed point, not via bc#979
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

assert_within_delta called bashunit::math::calculate twice, and each call is a subshell wrapping a bc (or awk) process — four forks per assertion, on a per-assertion path.

beforeafter
assert_within_delta ×2001092 ms165 ms
fork-free floor108 ms108 ms

💡 Changes

The comparison is |expected - actual| <= delta, which needs no floating point at all. All three operands are padded to one decimal scale and compared as integers, in pure bash.

The fast path is deliberately narrow and refuses what it cannot represent exactly — exponent notation, a sign anywhere but the front, or enough digits to risk 64-bit overflow — so those fall through to the existing bc/awk chain rather than getting a quietly wrong answer.

bashunit::math::is_le gets the same fast path; it had the identical bc > awk > strip-decimals chain for the same reason.

🐛 Also fixes a bug, rather than moving it

_is_numeric accepts a leading +, but bc cannot parse one: +5 - 5 returned an empty string, which compared unequal to "1", so assert_within_delta +5 5 1 failed. The sign is now stripped once before either path — so the fallback is fixed too, not just bypassed.

✅ How agreement was verified

Forcing the fixed-point path to always refuse leaves the entire numeric suite green on the bc/awk path. That's the check that the two paths agree, rather than just that the new one passes.

Slots rather than echoes for the three helpers — not stylistic: the caller needs the decimal count three times per assertion, and three $( ) captures would cost more than the two bc forks this change exists to remove.

🔒 Verification

Bash 3.0 safe — parameter expansion, case and integer arithmetic only; compat gate green (14/14). Fork budgets unchanged. make sa · make lint · bash build.sh bin -v✅ Build verified ✅ · 1661 sequential / 1620 parallel-simple-strict.

assert_within_delta called bashunit::math::calculate twice, and each call is a
subshell wrapping a `bc` (or `awk`) process. Four forks per assertion on a
per-assertion path: 200 calls took 1092ms where the fork-free floor is ~108ms.
They now take 165ms.
The comparison is |expected - actual| <= delta, which needs no floating point at
all. All three operands are padded to one decimal scale and compared as
integers, in pure bash.
The fast path is deliberately narrow and refuses what it cannot represent
exactly -- exponent notation, a sign anywhere but the front, or enough digits to
risk 64-bit overflow -- so those fall through to the existing bc/awk chain
rather than getting a quietly wrong answer. Both paths were run against the full
numeric suite: forcing the fixed-point path to always refuse leaves every test
green, which is the check that they agree.
This also fixes a bug rather than only moving it. _is_numeric accepts a leading
`+`, but bc cannot parse one: `+5 - 5` returned an empty string, which compared
unequal to "1", so `assert_within_delta +5 5 1` failed. The sign is now stripped
once before either path, so the fallback is fixed too and not just bypassed.
bashunit::math::is_le gets the same fast path; it had the identical bc > awk >
strip-decimals chain for the same reason.
The three helpers return through slots rather than echoing. That is not
stylistic here: the caller needs the decimal count three times per assertion,
and three `$( )` captures would cost more than the two bc forks the whole change
exists to remove.
Bash 3.0 safe: parameter expansion, `case` and integer arithmetic only. Fork
budgets unchanged; compat gate green; 1661 sequential / 1620 parallel.
@ChemaclassChemaclass added the enhancement New feature or request label Aug 6, 2026
@ChemaclassChemaclass self-assigned this Aug 6, 2026
@Chemaclass

Copy link
Copy Markdown
MemberAuthor

Reopening to re-trigger CI; no pull_request runs were created.

@ChemaclassChemaclass reopened this Aug 6, 2026
@Chemaclass
Chemaclassforce-pushed the perf/fixed-point-numeric-comparison branch from bc0e872 to 9608465CompareAugust 6, 2026 19:54
@Chemaclass
Chemaclass merged commit 5b31658 into mainAug 7, 2026
37 checks passed
@Chemaclass
Chemaclass deleted the perf/fixed-point-numeric-comparison branch August 7, 2026 10:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' perf(assert): compare assert_within_delta in fixed point, not via bc by Chemaclass · Pull Request #979 · TypedDevs/bashunit · GitHub
Skip to content

perf(assert): compare assert_within_delta in fixed point, not via bc - #979

Merged
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison
Aug 7, 2026
Merged

perf(assert): compare assert_within_delta in fixed point, not via bc#979
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

assert_within_delta called bashunit::math::calculate twice, and each call is a subshell wrapping a bc (or awk) process — four forks per assertion, on a per-assertion path.

beforeafter
assert_within_delta ×2001092 ms165 ms
fork-free floor108 ms108 ms

💡 Changes

The comparison is |expected - actual| <= delta, which needs no floating point at all. All three operands are padded to one decimal scale and compared as integers, in pure bash.

The fast path is deliberately narrow and refuses what it cannot represent exactly — exponent notation, a sign anywhere but the front, or enough digits to risk 64-bit overflow — so those fall through to the existing bc/awk chain rather than getting a quietly wrong answer.

bashunit::math::is_le gets the same fast path; it had the identical bc > awk > strip-decimals chain for the same reason.

🐛 Also fixes a bug, rather than moving it

_is_numeric accepts a leading +, but bc cannot parse one: +5 - 5 returned an empty string, which compared unequal to "1", so assert_within_delta +5 5 1 failed. The sign is now stripped once before either path — so the fallback is fixed too, not just bypassed.

✅ How agreement was verified

Forcing the fixed-point path to always refuse leaves the entire numeric suite green on the bc/awk path. That's the check that the two paths agree, rather than just that the new one passes.

Slots rather than echoes for the three helpers — not stylistic: the caller needs the decimal count three times per assertion, and three $( ) captures would cost more than the two bc forks this change exists to remove.

🔒 Verification

Bash 3.0 safe — parameter expansion, case and integer arithmetic only; compat gate green (14/14). Fork budgets unchanged. make sa · make lint · bash build.sh bin -v✅ Build verified ✅ · 1661 sequential / 1620 parallel-simple-strict.

assert_within_delta called bashunit::math::calculate twice, and each call is a
subshell wrapping a `bc` (or `awk`) process. Four forks per assertion on a
per-assertion path: 200 calls took 1092ms where the fork-free floor is ~108ms.
They now take 165ms.
The comparison is |expected - actual| <= delta, which needs no floating point at
all. All three operands are padded to one decimal scale and compared as
integers, in pure bash.
The fast path is deliberately narrow and refuses what it cannot represent
exactly -- exponent notation, a sign anywhere but the front, or enough digits to
risk 64-bit overflow -- so those fall through to the existing bc/awk chain
rather than getting a quietly wrong answer. Both paths were run against the full
numeric suite: forcing the fixed-point path to always refuse leaves every test
green, which is the check that they agree.
This also fixes a bug rather than only moving it. _is_numeric accepts a leading
`+`, but bc cannot parse one: `+5 - 5` returned an empty string, which compared
unequal to "1", so `assert_within_delta +5 5 1` failed. The sign is now stripped
once before either path, so the fallback is fixed too and not just bypassed.
bashunit::math::is_le gets the same fast path; it had the identical bc > awk >
strip-decimals chain for the same reason.
The three helpers return through slots rather than echoing. That is not
stylistic here: the caller needs the decimal count three times per assertion,
and three `$( )` captures would cost more than the two bc forks the whole change
exists to remove.
Bash 3.0 safe: parameter expansion, `case` and integer arithmetic only. Fork
budgets unchanged; compat gate green; 1661 sequential / 1620 parallel.
@ChemaclassChemaclass added the enhancement New feature or request label Aug 6, 2026
@ChemaclassChemaclass self-assigned this Aug 6, 2026
@Chemaclass

Copy link
Copy Markdown
MemberAuthor

Reopening to re-trigger CI; no pull_request runs were created.

@ChemaclassChemaclass reopened this Aug 6, 2026
@Chemaclass
Chemaclassforce-pushed the perf/fixed-point-numeric-comparison branch from bc0e872 to 9608465CompareAugust 6, 2026 19:54
@Chemaclass
Chemaclass merged commit 5b31658 into mainAug 7, 2026
37 checks passed
@Chemaclass
Chemaclass deleted the perf/fixed-point-numeric-comparison branch August 7, 2026 10:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' perf(assert): compare assert_within_delta in fixed point, not via bc by Chemaclass · Pull Request #979 · TypedDevs/bashunit · GitHub
Skip to content

perf(assert): compare assert_within_delta in fixed point, not via bc - #979

Merged
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison
Aug 7, 2026
Merged

perf(assert): compare assert_within_delta in fixed point, not via bc#979
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

assert_within_delta called bashunit::math::calculate twice, and each call is a subshell wrapping a bc (or awk) process — four forks per assertion, on a per-assertion path.

beforeafter
assert_within_delta ×2001092 ms165 ms
fork-free floor108 ms108 ms

💡 Changes

The comparison is |expected - actual| <= delta, which needs no floating point at all. All three operands are padded to one decimal scale and compared as integers, in pure bash.

The fast path is deliberately narrow and refuses what it cannot represent exactly — exponent notation, a sign anywhere but the front, or enough digits to risk 64-bit overflow — so those fall through to the existing bc/awk chain rather than getting a quietly wrong answer.

bashunit::math::is_le gets the same fast path; it had the identical bc > awk > strip-decimals chain for the same reason.

🐛 Also fixes a bug, rather than moving it

_is_numeric accepts a leading +, but bc cannot parse one: +5 - 5 returned an empty string, which compared unequal to "1", so assert_within_delta +5 5 1 failed. The sign is now stripped once before either path — so the fallback is fixed too, not just bypassed.

✅ How agreement was verified

Forcing the fixed-point path to always refuse leaves the entire numeric suite green on the bc/awk path. That's the check that the two paths agree, rather than just that the new one passes.

Slots rather than echoes for the three helpers — not stylistic: the caller needs the decimal count three times per assertion, and three $( ) captures would cost more than the two bc forks this change exists to remove.

🔒 Verification

Bash 3.0 safe — parameter expansion, case and integer arithmetic only; compat gate green (14/14). Fork budgets unchanged. make sa · make lint · bash build.sh bin -v✅ Build verified ✅ · 1661 sequential / 1620 parallel-simple-strict.

assert_within_delta called bashunit::math::calculate twice, and each call is a
subshell wrapping a `bc` (or `awk`) process. Four forks per assertion on a
per-assertion path: 200 calls took 1092ms where the fork-free floor is ~108ms.
They now take 165ms.
The comparison is |expected - actual| <= delta, which needs no floating point at
all. All three operands are padded to one decimal scale and compared as
integers, in pure bash.
The fast path is deliberately narrow and refuses what it cannot represent
exactly -- exponent notation, a sign anywhere but the front, or enough digits to
risk 64-bit overflow -- so those fall through to the existing bc/awk chain
rather than getting a quietly wrong answer. Both paths were run against the full
numeric suite: forcing the fixed-point path to always refuse leaves every test
green, which is the check that they agree.
This also fixes a bug rather than only moving it. _is_numeric accepts a leading
`+`, but bc cannot parse one: `+5 - 5` returned an empty string, which compared
unequal to "1", so `assert_within_delta +5 5 1` failed. The sign is now stripped
once before either path, so the fallback is fixed too and not just bypassed.
bashunit::math::is_le gets the same fast path; it had the identical bc > awk >
strip-decimals chain for the same reason.
The three helpers return through slots rather than echoing. That is not
stylistic here: the caller needs the decimal count three times per assertion,
and three `$( )` captures would cost more than the two bc forks the whole change
exists to remove.
Bash 3.0 safe: parameter expansion, `case` and integer arithmetic only. Fork
budgets unchanged; compat gate green; 1661 sequential / 1620 parallel.
@ChemaclassChemaclass added the enhancement New feature or request label Aug 6, 2026
@ChemaclassChemaclass self-assigned this Aug 6, 2026
@Chemaclass

Copy link
Copy Markdown
MemberAuthor

Reopening to re-trigger CI; no pull_request runs were created.

@ChemaclassChemaclass reopened this Aug 6, 2026
@Chemaclass
Chemaclassforce-pushed the perf/fixed-point-numeric-comparison branch from bc0e872 to 9608465CompareAugust 6, 2026 19:54
@Chemaclass
Chemaclass merged commit 5b31658 into mainAug 7, 2026
37 checks passed
@Chemaclass
Chemaclass deleted the perf/fixed-point-numeric-comparison branch August 7, 2026 10:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); perf(assert): compare assert_within_delta in fixed point, not via bc by Chemaclass · Pull Request #979 · TypedDevs/bashunit · GitHub
Skip to content

perf(assert): compare assert_within_delta in fixed point, not via bc - #979

Merged
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison
Aug 7, 2026
Merged

perf(assert): compare assert_within_delta in fixed point, not via bc#979
Chemaclass merged 2 commits into
mainfrom
perf/fixed-point-numeric-comparison

Conversation

@Chemaclass

Copy link
Copy Markdown
Member

🤔 Background

assert_within_delta called bashunit::math::calculate twice, and each call is a subshell wrapping a bc (or awk) process — four forks per assertion, on a per-assertion path.

beforeafter
assert_within_delta ×2001092 ms165 ms
fork-free floor108 ms108 ms

💡 Changes

The comparison is |expected - actual| <= delta, which needs no floating point at all. All three operands are padded to one decimal scale and compared as integers, in pure bash.

The fast path is deliberately narrow and refuses what it cannot represent exactly — exponent notation, a sign anywhere but the front, or enough digits to risk 64-bit overflow — so those fall through to the existing bc/awk chain rather than getting a quietly wrong answer.

bashunit::math::is_le gets the same fast path; it had the identical bc > awk > strip-decimals chain for the same reason.

🐛 Also fixes a bug, rather than moving it

_is_numeric accepts a leading +, but bc cannot parse one: +5 - 5 returned an empty string, which compared unequal to "1", so assert_within_delta +5 5 1 failed. The sign is now stripped once before either path — so the fallback is fixed too, not just bypassed.

✅ How agreement was verified

Forcing the fixed-point path to always refuse leaves the entire numeric suite green on the bc/awk path. That's the check that the two paths agree, rather than just that the new one passes.

Slots rather than echoes for the three helpers — not stylistic: the caller needs the decimal count three times per assertion, and three $( ) captures would cost more than the two bc forks this change exists to remove.

🔒 Verification

Bash 3.0 safe — parameter expansion, case and integer arithmetic only; compat gate green (14/14). Fork budgets unchanged. make sa · make lint · bash build.sh bin -v✅ Build verified ✅ · 1661 sequential / 1620 parallel-simple-strict.

assert_within_delta called bashunit::math::calculate twice, and each call is a
subshell wrapping a `bc` (or `awk`) process. Four forks per assertion on a
per-assertion path: 200 calls took 1092ms where the fork-free floor is ~108ms.
They now take 165ms.
The comparison is |expected - actual| <= delta, which needs no floating point at
all. All three operands are padded to one decimal scale and compared as
integers, in pure bash.
The fast path is deliberately narrow and refuses what it cannot represent
exactly -- exponent notation, a sign anywhere but the front, or enough digits to
risk 64-bit overflow -- so those fall through to the existing bc/awk chain
rather than getting a quietly wrong answer. Both paths were run against the full
numeric suite: forcing the fixed-point path to always refuse leaves every test
green, which is the check that they agree.
This also fixes a bug rather than only moving it. _is_numeric accepts a leading
`+`, but bc cannot parse one: `+5 - 5` returned an empty string, which compared
unequal to "1", so `assert_within_delta +5 5 1` failed. The sign is now stripped
once before either path, so the fallback is fixed too and not just bypassed.
bashunit::math::is_le gets the same fast path; it had the identical bc > awk >
strip-decimals chain for the same reason.
The three helpers return through slots rather than echoing. That is not
stylistic here: the caller needs the decimal count three times per assertion,
and three `$( )` captures would cost more than the two bc forks the whole change
exists to remove.
Bash 3.0 safe: parameter expansion, `case` and integer arithmetic only. Fork
budgets unchanged; compat gate green; 1661 sequential / 1620 parallel.
@ChemaclassChemaclass added the enhancement New feature or request label Aug 6, 2026
@ChemaclassChemaclass self-assigned this Aug 6, 2026
@Chemaclass

Copy link
Copy Markdown
MemberAuthor

Reopening to re-trigger CI; no pull_request runs were created.

@ChemaclassChemaclass reopened this Aug 6, 2026
@Chemaclass
Chemaclassforce-pushed the perf/fixed-point-numeric-comparison branch from bc0e872 to 9608465CompareAugust 6, 2026 19:54
@Chemaclass
Chemaclass merged commit 5b31658 into mainAug 7, 2026
37 checks passed
@Chemaclass
Chemaclass deleted the perf/fixed-point-numeric-comparison branch August 7, 2026 10:25
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Chemaclass