fix: remove redundant cache load and avoid GSettings lookup on every tick - #534

Open
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations
Open

fix: remove redundant cache load and avoid GSettings lookup on every tick#534
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations

Conversation

@glazari1

Copy link
Copy Markdown

Hey @corecoding, here's the follow-up with the two items from my comment.

Summary

  • Extract _ensureTimeSeriesLoaded() to deduplicate the cache load + merge
    logic (now used on first hover and on disable — prevents overwriting
    persisted history when the user never opened the popout)
  • Remove redundant loadTimeSeries() from _init() — the lazy-load
    handles it with proper merge
  • Cache show-sensor-history-graph in a _recordTimeSeries flag instead
    of calling get_boolean() on every sensor tick (6 calls/sec with
    default settings)
  • Keep _recordTimeSeries and _timeSeriesLoaded in sync when toggling
    the setting on/off

Changes

extension.js:

  • New _ensureTimeSeriesLoaded() method (extracted from _showHistoryPopout)
  • _showHistoryPopout() calls _ensureTimeSeriesLoaded() instead of inline merge
  • disable() calls _ensureTimeSeriesLoaded() before saving
  • Signal handler updates _recordTimeSeries and _timeSeriesLoaded on toggle
  • Remove loadTimeSeries() from _init()

values.js:

  • Add _recordTimeSeries flag initialized from settings in _init()
  • _pushTimePoint() checks cached flag instead of get_boolean()

Test plan

  • Enable graph, collect data, hover sensor — graph shows correctly
  • Enable graph, collect data, disable extension without hovering — re-enable and check history is preserved
  • Toggle graph off/on via settings, verify data recording stops/resumes
  • Monitor with pidstat — no GSettings overhead on every tick

…tick
- Extract _ensureTimeSeriesLoaded() to deduplicate cache load + merge
logic (used on first hover and on disable)
- Remove redundant loadTimeSeries() from _init() — the lazy-load in
_ensureTimeSeriesLoaded() handles it with proper merge
- Cache show-sensor-history-graph in a _recordTimeSeries flag instead
of calling get_boolean() on every sensor tick
- Keep _recordTimeSeries and _timeSeriesLoaded in sync on setting toggle
@corecoding

Copy link
Copy Markdown
Owner

I forgot to push a change before your last PR, now there is a minor conflict. My primary change is below - this gets rid of two for loops. By the way, I ended up submitting an update to Vitals with the History feature removed. Another person submitted a bug report. I would like to get more people verifying this PR fixes the issue. In all honesty, even with 200 instead of 3600 datapoints, I still feel like there will be a stutter, albeit smaller.

 const memSeries = this._values._timeSeries;
const memFormat = this._values._timeSeriesFormat;

@glazari1

glazari1 commented Apr 8, 2026

Copy link
Copy Markdown
Author

Thanks for the update! I understand the decision to remove the feature in v74 while it's being validated.

For what it's worth, I've been running the graph-history branch locally (Ryzen + GNOME 46, Ubuntu 24.04) and it's been completely smooth, measured ~12% average CPU on gnome-shell with zero GC spikes over multiple 15s samples using pidstat (was 60-70% spikes every ~11s before the fix). The widget reuse in history.js seems to make a big difference alongside the downsample.

Let me know if you'd like me to help with anything else or if more testing data would be useful.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@glazari1@corecoding
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix: remove redundant cache load and avoid GSettings lookup on every tick - #534

Open
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations
Open

fix: remove redundant cache load and avoid GSettings lookup on every tick#534
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations

Conversation

@glazari1

Copy link
Copy Markdown

Hey @corecoding, here's the follow-up with the two items from my comment.

Summary

  • Extract _ensureTimeSeriesLoaded() to deduplicate the cache load + merge
    logic (now used on first hover and on disable — prevents overwriting
    persisted history when the user never opened the popout)
  • Remove redundant loadTimeSeries() from _init() — the lazy-load
    handles it with proper merge
  • Cache show-sensor-history-graph in a _recordTimeSeries flag instead
    of calling get_boolean() on every sensor tick (6 calls/sec with
    default settings)
  • Keep _recordTimeSeries and _timeSeriesLoaded in sync when toggling
    the setting on/off

Changes

extension.js:

  • New _ensureTimeSeriesLoaded() method (extracted from _showHistoryPopout)
  • _showHistoryPopout() calls _ensureTimeSeriesLoaded() instead of inline merge
  • disable() calls _ensureTimeSeriesLoaded() before saving
  • Signal handler updates _recordTimeSeries and _timeSeriesLoaded on toggle
  • Remove loadTimeSeries() from _init()

values.js:

  • Add _recordTimeSeries flag initialized from settings in _init()
  • _pushTimePoint() checks cached flag instead of get_boolean()

Test plan

  • Enable graph, collect data, hover sensor — graph shows correctly
  • Enable graph, collect data, disable extension without hovering — re-enable and check history is preserved
  • Toggle graph off/on via settings, verify data recording stops/resumes
  • Monitor with pidstat — no GSettings overhead on every tick

…tick
- Extract _ensureTimeSeriesLoaded() to deduplicate cache load + merge
logic (used on first hover and on disable)
- Remove redundant loadTimeSeries() from _init() — the lazy-load in
_ensureTimeSeriesLoaded() handles it with proper merge
- Cache show-sensor-history-graph in a _recordTimeSeries flag instead
of calling get_boolean() on every sensor tick
- Keep _recordTimeSeries and _timeSeriesLoaded in sync on setting toggle
@corecoding

Copy link
Copy Markdown
Owner

I forgot to push a change before your last PR, now there is a minor conflict. My primary change is below - this gets rid of two for loops. By the way, I ended up submitting an update to Vitals with the History feature removed. Another person submitted a bug report. I would like to get more people verifying this PR fixes the issue. In all honesty, even with 200 instead of 3600 datapoints, I still feel like there will be a stutter, albeit smaller.

 const memSeries = this._values._timeSeries;
const memFormat = this._values._timeSeriesFormat;

@glazari1

glazari1 commented Apr 8, 2026

Copy link
Copy Markdown
Author

Thanks for the update! I understand the decision to remove the feature in v74 while it's being validated.

For what it's worth, I've been running the graph-history branch locally (Ryzen + GNOME 46, Ubuntu 24.04) and it's been completely smooth, measured ~12% average CPU on gnome-shell with zero GC spikes over multiple 15s samples using pidstat (was 60-70% spikes every ~11s before the fix). The widget reuse in history.js seems to make a big difference alongside the downsample.

Let me know if you'd like me to help with anything else or if more testing data would be useful.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@glazari1@corecoding
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: remove redundant cache load and avoid GSettings lookup on every tick - #534

Open
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations
Open

fix: remove redundant cache load and avoid GSettings lookup on every tick#534
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations

Conversation

@glazari1

Copy link
Copy Markdown

Hey @corecoding, here's the follow-up with the two items from my comment.

Summary

  • Extract _ensureTimeSeriesLoaded() to deduplicate the cache load + merge
    logic (now used on first hover and on disable — prevents overwriting
    persisted history when the user never opened the popout)
  • Remove redundant loadTimeSeries() from _init() — the lazy-load
    handles it with proper merge
  • Cache show-sensor-history-graph in a _recordTimeSeries flag instead
    of calling get_boolean() on every sensor tick (6 calls/sec with
    default settings)
  • Keep _recordTimeSeries and _timeSeriesLoaded in sync when toggling
    the setting on/off

Changes

extension.js:

  • New _ensureTimeSeriesLoaded() method (extracted from _showHistoryPopout)
  • _showHistoryPopout() calls _ensureTimeSeriesLoaded() instead of inline merge
  • disable() calls _ensureTimeSeriesLoaded() before saving
  • Signal handler updates _recordTimeSeries and _timeSeriesLoaded on toggle
  • Remove loadTimeSeries() from _init()

values.js:

  • Add _recordTimeSeries flag initialized from settings in _init()
  • _pushTimePoint() checks cached flag instead of get_boolean()

Test plan

  • Enable graph, collect data, hover sensor — graph shows correctly
  • Enable graph, collect data, disable extension without hovering — re-enable and check history is preserved
  • Toggle graph off/on via settings, verify data recording stops/resumes
  • Monitor with pidstat — no GSettings overhead on every tick

…tick
- Extract _ensureTimeSeriesLoaded() to deduplicate cache load + merge
logic (used on first hover and on disable)
- Remove redundant loadTimeSeries() from _init() — the lazy-load in
_ensureTimeSeriesLoaded() handles it with proper merge
- Cache show-sensor-history-graph in a _recordTimeSeries flag instead
of calling get_boolean() on every sensor tick
- Keep _recordTimeSeries and _timeSeriesLoaded in sync on setting toggle
@corecoding

Copy link
Copy Markdown
Owner

I forgot to push a change before your last PR, now there is a minor conflict. My primary change is below - this gets rid of two for loops. By the way, I ended up submitting an update to Vitals with the History feature removed. Another person submitted a bug report. I would like to get more people verifying this PR fixes the issue. In all honesty, even with 200 instead of 3600 datapoints, I still feel like there will be a stutter, albeit smaller.

 const memSeries = this._values._timeSeries;
const memFormat = this._values._timeSeriesFormat;

@glazari1

glazari1 commented Apr 8, 2026

Copy link
Copy Markdown
Author

Thanks for the update! I understand the decision to remove the feature in v74 while it's being validated.

For what it's worth, I've been running the graph-history branch locally (Ryzen + GNOME 46, Ubuntu 24.04) and it's been completely smooth, measured ~12% average CPU on gnome-shell with zero GC spikes over multiple 15s samples using pidstat (was 60-70% spikes every ~11s before the fix). The widget reuse in history.js seems to make a big difference alongside the downsample.

Let me know if you'd like me to help with anything else or if more testing data would be useful.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

fix: remove redundant cache load and avoid GSettings lookup on every tick - #534

Open
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations
Open

fix: remove redundant cache load and avoid GSettings lookup on every tick#534
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations

Conversation

@glazari1

Copy link
Copy Markdown

Hey @corecoding, here's the follow-up with the two items from my comment.

Summary

  • Extract _ensureTimeSeriesLoaded() to deduplicate the cache load + merge
    logic (now used on first hover and on disable — prevents overwriting
    persisted history when the user never opened the popout)
  • Remove redundant loadTimeSeries() from _init() — the lazy-load
    handles it with proper merge
  • Cache show-sensor-history-graph in a _recordTimeSeries flag instead
    of calling get_boolean() on every sensor tick (6 calls/sec with
    default settings)
  • Keep _recordTimeSeries and _timeSeriesLoaded in sync when toggling
    the setting on/off

Changes

extension.js:

  • New _ensureTimeSeriesLoaded() method (extracted from _showHistoryPopout)
  • _showHistoryPopout() calls _ensureTimeSeriesLoaded() instead of inline merge
  • disable() calls _ensureTimeSeriesLoaded() before saving
  • Signal handler updates _recordTimeSeries and _timeSeriesLoaded on toggle
  • Remove loadTimeSeries() from _init()

values.js:

  • Add _recordTimeSeries flag initialized from settings in _init()
  • _pushTimePoint() checks cached flag instead of get_boolean()

Test plan

  • Enable graph, collect data, hover sensor — graph shows correctly
  • Enable graph, collect data, disable extension without hovering — re-enable and check history is preserved
  • Toggle graph off/on via settings, verify data recording stops/resumes
  • Monitor with pidstat — no GSettings overhead on every tick

…tick
- Extract _ensureTimeSeriesLoaded() to deduplicate cache load + merge
logic (used on first hover and on disable)
- Remove redundant loadTimeSeries() from _init() — the lazy-load in
_ensureTimeSeriesLoaded() handles it with proper merge
- Cache show-sensor-history-graph in a _recordTimeSeries flag instead
of calling get_boolean() on every sensor tick
- Keep _recordTimeSeries and _timeSeriesLoaded in sync on setting toggle
@corecoding

Copy link
Copy Markdown
Owner

I forgot to push a change before your last PR, now there is a minor conflict. My primary change is below - this gets rid of two for loops. By the way, I ended up submitting an update to Vitals with the History feature removed. Another person submitted a bug report. I would like to get more people verifying this PR fixes the issue. In all honesty, even with 200 instead of 3600 datapoints, I still feel like there will be a stutter, albeit smaller.

 const memSeries = this._values._timeSeries;
const memFormat = this._values._timeSeriesFormat;

@glazari1

glazari1 commented Apr 8, 2026

Copy link
Copy Markdown
Author

Thanks for the update! I understand the decision to remove the feature in v74 while it's being validated.

For what it's worth, I've been running the graph-history branch locally (Ryzen + GNOME 46, Ubuntu 24.04) and it's been completely smooth, measured ~12% average CPU on gnome-shell with zero GC spikes over multiple 15s samples using pidstat (was 60-70% spikes every ~11s before the fix). The widget reuse in history.js seems to make a big difference alongside the downsample.

Let me know if you'd like me to help with anything else or if more testing data would be useful.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

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

fix: remove redundant cache load and avoid GSettings lookup on every tick - #534

Open
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations
Open

fix: remove redundant cache load and avoid GSettings lookup on every tick#534
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations

Conversation

@glazari1

Copy link
Copy Markdown

Hey @corecoding, here's the follow-up with the two items from my comment.

Summary

  • Extract _ensureTimeSeriesLoaded() to deduplicate the cache load + merge
    logic (now used on first hover and on disable — prevents overwriting
    persisted history when the user never opened the popout)
  • Remove redundant loadTimeSeries() from _init() — the lazy-load
    handles it with proper merge
  • Cache show-sensor-history-graph in a _recordTimeSeries flag instead
    of calling get_boolean() on every sensor tick (6 calls/sec with
    default settings)
  • Keep _recordTimeSeries and _timeSeriesLoaded in sync when toggling
    the setting on/off

Changes

extension.js:

  • New _ensureTimeSeriesLoaded() method (extracted from _showHistoryPopout)
  • _showHistoryPopout() calls _ensureTimeSeriesLoaded() instead of inline merge
  • disable() calls _ensureTimeSeriesLoaded() before saving
  • Signal handler updates _recordTimeSeries and _timeSeriesLoaded on toggle
  • Remove loadTimeSeries() from _init()

values.js:

  • Add _recordTimeSeries flag initialized from settings in _init()
  • _pushTimePoint() checks cached flag instead of get_boolean()

Test plan

  • Enable graph, collect data, hover sensor — graph shows correctly
  • Enable graph, collect data, disable extension without hovering — re-enable and check history is preserved
  • Toggle graph off/on via settings, verify data recording stops/resumes
  • Monitor with pidstat — no GSettings overhead on every tick

…tick
- Extract _ensureTimeSeriesLoaded() to deduplicate cache load + merge
logic (used on first hover and on disable)
- Remove redundant loadTimeSeries() from _init() — the lazy-load in
_ensureTimeSeriesLoaded() handles it with proper merge
- Cache show-sensor-history-graph in a _recordTimeSeries flag instead
of calling get_boolean() on every sensor tick
- Keep _recordTimeSeries and _timeSeriesLoaded in sync on setting toggle
@corecoding

Copy link
Copy Markdown
Owner

I forgot to push a change before your last PR, now there is a minor conflict. My primary change is below - this gets rid of two for loops. By the way, I ended up submitting an update to Vitals with the History feature removed. Another person submitted a bug report. I would like to get more people verifying this PR fixes the issue. In all honesty, even with 200 instead of 3600 datapoints, I still feel like there will be a stutter, albeit smaller.

 const memSeries = this._values._timeSeries;
const memFormat = this._values._timeSeriesFormat;

@glazari1

glazari1 commented Apr 8, 2026

Copy link
Copy Markdown
Author

Thanks for the update! I understand the decision to remove the feature in v74 while it's being validated.

For what it's worth, I've been running the graph-history branch locally (Ryzen + GNOME 46, Ubuntu 24.04) and it's been completely smooth, measured ~12% average CPU on gnome-shell with zero GC spikes over multiple 15s samples using pidstat (was 60-70% spikes every ~11s before the fix). The widget reuse in history.js seems to make a big difference alongside the downsample.

Let me know if you'd like me to help with anything else or if more testing data would be useful.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@glazari1@corecoding
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: remove redundant cache load and avoid GSettings lookup on every tick - #534

Open
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations
Open

fix: remove redundant cache load and avoid GSettings lookup on every tick#534
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations

Conversation

@glazari1

Copy link
Copy Markdown

Hey @corecoding, here's the follow-up with the two items from my comment.

Summary

  • Extract _ensureTimeSeriesLoaded() to deduplicate the cache load + merge
    logic (now used on first hover and on disable — prevents overwriting
    persisted history when the user never opened the popout)
  • Remove redundant loadTimeSeries() from _init() — the lazy-load
    handles it with proper merge
  • Cache show-sensor-history-graph in a _recordTimeSeries flag instead
    of calling get_boolean() on every sensor tick (6 calls/sec with
    default settings)
  • Keep _recordTimeSeries and _timeSeriesLoaded in sync when toggling
    the setting on/off

Changes

extension.js:

  • New _ensureTimeSeriesLoaded() method (extracted from _showHistoryPopout)
  • _showHistoryPopout() calls _ensureTimeSeriesLoaded() instead of inline merge
  • disable() calls _ensureTimeSeriesLoaded() before saving
  • Signal handler updates _recordTimeSeries and _timeSeriesLoaded on toggle
  • Remove loadTimeSeries() from _init()

values.js:

  • Add _recordTimeSeries flag initialized from settings in _init()
  • _pushTimePoint() checks cached flag instead of get_boolean()

Test plan

  • Enable graph, collect data, hover sensor — graph shows correctly
  • Enable graph, collect data, disable extension without hovering — re-enable and check history is preserved
  • Toggle graph off/on via settings, verify data recording stops/resumes
  • Monitor with pidstat — no GSettings overhead on every tick

…tick
- Extract _ensureTimeSeriesLoaded() to deduplicate cache load + merge
logic (used on first hover and on disable)
- Remove redundant loadTimeSeries() from _init() — the lazy-load in
_ensureTimeSeriesLoaded() handles it with proper merge
- Cache show-sensor-history-graph in a _recordTimeSeries flag instead
of calling get_boolean() on every sensor tick
- Keep _recordTimeSeries and _timeSeriesLoaded in sync on setting toggle
@corecoding

Copy link
Copy Markdown
Owner

I forgot to push a change before your last PR, now there is a minor conflict. My primary change is below - this gets rid of two for loops. By the way, I ended up submitting an update to Vitals with the History feature removed. Another person submitted a bug report. I would like to get more people verifying this PR fixes the issue. In all honesty, even with 200 instead of 3600 datapoints, I still feel like there will be a stutter, albeit smaller.

 const memSeries = this._values._timeSeries;
const memFormat = this._values._timeSeriesFormat;

@glazari1

glazari1 commented Apr 8, 2026

Copy link
Copy Markdown
Author

Thanks for the update! I understand the decision to remove the feature in v74 while it's being validated.

For what it's worth, I've been running the graph-history branch locally (Ryzen + GNOME 46, Ubuntu 24.04) and it's been completely smooth, measured ~12% average CPU on gnome-shell with zero GC spikes over multiple 15s samples using pidstat (was 60-70% spikes every ~11s before the fix). The widget reuse in history.js seems to make a big difference alongside the downsample.

Let me know if you'd like me to help with anything else or if more testing data would be useful.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@glazari1@corecoding
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix: remove redundant cache load and avoid GSettings lookup on every tick - #534

Open
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations
Open

fix: remove redundant cache load and avoid GSettings lookup on every tick#534
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations

Conversation

@glazari1

Copy link
Copy Markdown

Hey @corecoding, here's the follow-up with the two items from my comment.

Summary

  • Extract _ensureTimeSeriesLoaded() to deduplicate the cache load + merge
    logic (now used on first hover and on disable — prevents overwriting
    persisted history when the user never opened the popout)
  • Remove redundant loadTimeSeries() from _init() — the lazy-load
    handles it with proper merge
  • Cache show-sensor-history-graph in a _recordTimeSeries flag instead
    of calling get_boolean() on every sensor tick (6 calls/sec with
    default settings)
  • Keep _recordTimeSeries and _timeSeriesLoaded in sync when toggling
    the setting on/off

Changes

extension.js:

  • New _ensureTimeSeriesLoaded() method (extracted from _showHistoryPopout)
  • _showHistoryPopout() calls _ensureTimeSeriesLoaded() instead of inline merge
  • disable() calls _ensureTimeSeriesLoaded() before saving
  • Signal handler updates _recordTimeSeries and _timeSeriesLoaded on toggle
  • Remove loadTimeSeries() from _init()

values.js:

  • Add _recordTimeSeries flag initialized from settings in _init()
  • _pushTimePoint() checks cached flag instead of get_boolean()

Test plan

  • Enable graph, collect data, hover sensor — graph shows correctly
  • Enable graph, collect data, disable extension without hovering — re-enable and check history is preserved
  • Toggle graph off/on via settings, verify data recording stops/resumes
  • Monitor with pidstat — no GSettings overhead on every tick

…tick
- Extract _ensureTimeSeriesLoaded() to deduplicate cache load + merge
logic (used on first hover and on disable)
- Remove redundant loadTimeSeries() from _init() — the lazy-load in
_ensureTimeSeriesLoaded() handles it with proper merge
- Cache show-sensor-history-graph in a _recordTimeSeries flag instead
of calling get_boolean() on every sensor tick
- Keep _recordTimeSeries and _timeSeriesLoaded in sync on setting toggle
@corecoding

Copy link
Copy Markdown
Owner

I forgot to push a change before your last PR, now there is a minor conflict. My primary change is below - this gets rid of two for loops. By the way, I ended up submitting an update to Vitals with the History feature removed. Another person submitted a bug report. I would like to get more people verifying this PR fixes the issue. In all honesty, even with 200 instead of 3600 datapoints, I still feel like there will be a stutter, albeit smaller.

 const memSeries = this._values._timeSeries;
const memFormat = this._values._timeSeriesFormat;

@glazari1

glazari1 commented Apr 8, 2026

Copy link
Copy Markdown
Author

Thanks for the update! I understand the decision to remove the feature in v74 while it's being validated.

For what it's worth, I've been running the graph-history branch locally (Ryzen + GNOME 46, Ubuntu 24.04) and it's been completely smooth, measured ~12% average CPU on gnome-shell with zero GC spikes over multiple 15s samples using pidstat (was 60-70% spikes every ~11s before the fix). The widget reuse in history.js seems to make a big difference alongside the downsample.

Let me know if you'd like me to help with anything else or if more testing data would be useful.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@glazari1@corecoding
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix: remove redundant cache load and avoid GSettings lookup on every tick - #534

Open
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations
Open

fix: remove redundant cache load and avoid GSettings lookup on every tick#534
glazari1 wants to merge 1 commit into
corecoding:graph-historyfrom
glazari1:fix/follow-up-optimizations

Conversation

@glazari1

Copy link
Copy Markdown

Hey @corecoding, here's the follow-up with the two items from my comment.

Summary

  • Extract _ensureTimeSeriesLoaded() to deduplicate the cache load + merge
    logic (now used on first hover and on disable — prevents overwriting
    persisted history when the user never opened the popout)
  • Remove redundant loadTimeSeries() from _init() — the lazy-load
    handles it with proper merge
  • Cache show-sensor-history-graph in a _recordTimeSeries flag instead
    of calling get_boolean() on every sensor tick (6 calls/sec with
    default settings)
  • Keep _recordTimeSeries and _timeSeriesLoaded in sync when toggling
    the setting on/off

Changes

extension.js:

  • New _ensureTimeSeriesLoaded() method (extracted from _showHistoryPopout)
  • _showHistoryPopout() calls _ensureTimeSeriesLoaded() instead of inline merge
  • disable() calls _ensureTimeSeriesLoaded() before saving
  • Signal handler updates _recordTimeSeries and _timeSeriesLoaded on toggle
  • Remove loadTimeSeries() from _init()

values.js:

  • Add _recordTimeSeries flag initialized from settings in _init()
  • _pushTimePoint() checks cached flag instead of get_boolean()

Test plan

  • Enable graph, collect data, hover sensor — graph shows correctly
  • Enable graph, collect data, disable extension without hovering — re-enable and check history is preserved
  • Toggle graph off/on via settings, verify data recording stops/resumes
  • Monitor with pidstat — no GSettings overhead on every tick

…tick
- Extract _ensureTimeSeriesLoaded() to deduplicate cache load + merge
logic (used on first hover and on disable)
- Remove redundant loadTimeSeries() from _init() — the lazy-load in
_ensureTimeSeriesLoaded() handles it with proper merge
- Cache show-sensor-history-graph in a _recordTimeSeries flag instead
of calling get_boolean() on every sensor tick
- Keep _recordTimeSeries and _timeSeriesLoaded in sync on setting toggle
@corecoding

Copy link
Copy Markdown
Owner

I forgot to push a change before your last PR, now there is a minor conflict. My primary change is below - this gets rid of two for loops. By the way, I ended up submitting an update to Vitals with the History feature removed. Another person submitted a bug report. I would like to get more people verifying this PR fixes the issue. In all honesty, even with 200 instead of 3600 datapoints, I still feel like there will be a stutter, albeit smaller.

 const memSeries = this._values._timeSeries;
const memFormat = this._values._timeSeriesFormat;

@glazari1

glazari1 commented Apr 8, 2026

Copy link
Copy Markdown
Author

Thanks for the update! I understand the decision to remove the feature in v74 while it's being validated.

For what it's worth, I've been running the graph-history branch locally (Ryzen + GNOME 46, Ubuntu 24.04) and it's been completely smooth, measured ~12% average CPU on gnome-shell with zero GC spikes over multiple 15s samples using pidstat (was 60-70% spikes every ~11s before the fix). The widget reuse in history.js seems to make a big difference alongside the downsample.

Let me know if you'd like me to help with anything else or if more testing data would be useful.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@glazari1@corecoding