Latest commit

History

34 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

When profiling code, the Rprof() function tells you how much time was spent in each function. Those functions that consume the most time are the most obvious candidates for making faster. However, it is also useful or important to know how often these functions were called. If we have two functions A and B, each consuming 60 minutes in the profiling, but A is called once and B is called 6 million times, often we might focus on A.

To count the number of times a particular function is called, we can use trace(), e.g.,

trace(attr, incrementAttrCounter)

incrementAttrCounter would be a function that adds one to a variable that we use to count the number of times attr() is called. Even better, we define a closure to create a generic, reusable counter

mkCounter =
function()
{
ctr = 0L
inc = function() ctr <<- ctr + 1L
list(inc = inc, value = function() ctr, reset = function() ctr <<- 0L)
}

Now we can use

attrCtr = mkCounter()
trace(attr, attrCtr$inc)

Then we run our code and when it finishes, we query the number of times attr() was called with

attrCtr$value()

If we want to count the number of calls to several functions, we can create a separate counter closure for each. Alternatively, we can create a single counter that keeps the counts for all of the functions in a named vector. Instead of passing the incrementing function to trace(), we call the incrementing function with the name of the function and then update the corresponding named element in our vector of counts, e.g.,

trace(dnorm, quote(ctr$inc("dnorm")))
trace(rnorm, quote(ctr$inc("rnorm")))

Rather than have the user explicitly create the counters and call trace(), this package provides higher-level functions to do these steps for you. For counting calls to a single function, use countCalls(), e.g.,

ctr = countMCalls(rnorm)
replicate(10, rnorm(0))
ctr$value()

For counting calls to multiple functions, use countMCalls(), e.g.,

ctr = countMCalls(dnorm, rnorm)
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()
ctr = countMCalls(funs = c("dnorm", "rnorm"))
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()

See inst/profilingEg/ for an example of how to use this with profiling information.

Call Stack

It can be useful to collect the call stack so that we can see from where it was called. From eg.R,

source("eg.R")
st = genStackCollector(num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

To get just the names of the functions being called (and not the actual calls and arguments), we use callNames as a filtering/preprocessing function on the calls before we store them:

st = genStackCollector(callNames, num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Latest commit

History

34 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

When profiling code, the Rprof() function tells you how much time was spent in each function. Those functions that consume the most time are the most obvious candidates for making faster. However, it is also useful or important to know how often these functions were called. If we have two functions A and B, each consuming 60 minutes in the profiling, but A is called once and B is called 6 million times, often we might focus on A.

To count the number of times a particular function is called, we can use trace(), e.g.,

trace(attr, incrementAttrCounter)

incrementAttrCounter would be a function that adds one to a variable that we use to count the number of times attr() is called. Even better, we define a closure to create a generic, reusable counter

mkCounter =
function()
{
ctr = 0L
inc = function() ctr <<- ctr + 1L
list(inc = inc, value = function() ctr, reset = function() ctr <<- 0L)
}

Now we can use

attrCtr = mkCounter()
trace(attr, attrCtr$inc)

Then we run our code and when it finishes, we query the number of times attr() was called with

attrCtr$value()

If we want to count the number of calls to several functions, we can create a separate counter closure for each. Alternatively, we can create a single counter that keeps the counts for all of the functions in a named vector. Instead of passing the incrementing function to trace(), we call the incrementing function with the name of the function and then update the corresponding named element in our vector of counts, e.g.,

trace(dnorm, quote(ctr$inc("dnorm")))
trace(rnorm, quote(ctr$inc("rnorm")))

Rather than have the user explicitly create the counters and call trace(), this package provides higher-level functions to do these steps for you. For counting calls to a single function, use countCalls(), e.g.,

ctr = countMCalls(rnorm)
replicate(10, rnorm(0))
ctr$value()

For counting calls to multiple functions, use countMCalls(), e.g.,

ctr = countMCalls(dnorm, rnorm)
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()
ctr = countMCalls(funs = c("dnorm", "rnorm"))
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()

See inst/profilingEg/ for an example of how to use this with profiling information.

Call Stack

It can be useful to collect the call stack so that we can see from where it was called. From eg.R,

source("eg.R")
st = genStackCollector(num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

To get just the names of the functions being called (and not the actual calls and arguments), we use callNames as a filtering/preprocessing function on the calls before we store them:

st = genStackCollector(callNames, num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Latest commit

History

34 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

When profiling code, the Rprof() function tells you how much time was spent in each function. Those functions that consume the most time are the most obvious candidates for making faster. However, it is also useful or important to know how often these functions were called. If we have two functions A and B, each consuming 60 minutes in the profiling, but A is called once and B is called 6 million times, often we might focus on A.

To count the number of times a particular function is called, we can use trace(), e.g.,

trace(attr, incrementAttrCounter)

incrementAttrCounter would be a function that adds one to a variable that we use to count the number of times attr() is called. Even better, we define a closure to create a generic, reusable counter

mkCounter =
function()
{
ctr = 0L
inc = function() ctr <<- ctr + 1L
list(inc = inc, value = function() ctr, reset = function() ctr <<- 0L)
}

Now we can use

attrCtr = mkCounter()
trace(attr, attrCtr$inc)

Then we run our code and when it finishes, we query the number of times attr() was called with

attrCtr$value()

If we want to count the number of calls to several functions, we can create a separate counter closure for each. Alternatively, we can create a single counter that keeps the counts for all of the functions in a named vector. Instead of passing the incrementing function to trace(), we call the incrementing function with the name of the function and then update the corresponding named element in our vector of counts, e.g.,

trace(dnorm, quote(ctr$inc("dnorm")))
trace(rnorm, quote(ctr$inc("rnorm")))

Rather than have the user explicitly create the counters and call trace(), this package provides higher-level functions to do these steps for you. For counting calls to a single function, use countCalls(), e.g.,

ctr = countMCalls(rnorm)
replicate(10, rnorm(0))
ctr$value()

For counting calls to multiple functions, use countMCalls(), e.g.,

ctr = countMCalls(dnorm, rnorm)
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()
ctr = countMCalls(funs = c("dnorm", "rnorm"))
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()

See inst/profilingEg/ for an example of how to use this with profiling information.

Call Stack

It can be useful to collect the call stack so that we can see from where it was called. From eg.R,

source("eg.R")
st = genStackCollector(num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

To get just the names of the functions being called (and not the actual calls and arguments), we use callNames as a filtering/preprocessing function on the calls before we store them:

st = genStackCollector(callNames, num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Latest commit

History

34 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

When profiling code, the Rprof() function tells you how much time was spent in each function. Those functions that consume the most time are the most obvious candidates for making faster. However, it is also useful or important to know how often these functions were called. If we have two functions A and B, each consuming 60 minutes in the profiling, but A is called once and B is called 6 million times, often we might focus on A.

To count the number of times a particular function is called, we can use trace(), e.g.,

trace(attr, incrementAttrCounter)

incrementAttrCounter would be a function that adds one to a variable that we use to count the number of times attr() is called. Even better, we define a closure to create a generic, reusable counter

mkCounter =
function()
{
ctr = 0L
inc = function() ctr <<- ctr + 1L
list(inc = inc, value = function() ctr, reset = function() ctr <<- 0L)
}

Now we can use

attrCtr = mkCounter()
trace(attr, attrCtr$inc)

Then we run our code and when it finishes, we query the number of times attr() was called with

attrCtr$value()

If we want to count the number of calls to several functions, we can create a separate counter closure for each. Alternatively, we can create a single counter that keeps the counts for all of the functions in a named vector. Instead of passing the incrementing function to trace(), we call the incrementing function with the name of the function and then update the corresponding named element in our vector of counts, e.g.,

trace(dnorm, quote(ctr$inc("dnorm")))
trace(rnorm, quote(ctr$inc("rnorm")))

Rather than have the user explicitly create the counters and call trace(), this package provides higher-level functions to do these steps for you. For counting calls to a single function, use countCalls(), e.g.,

ctr = countMCalls(rnorm)
replicate(10, rnorm(0))
ctr$value()

For counting calls to multiple functions, use countMCalls(), e.g.,

ctr = countMCalls(dnorm, rnorm)
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()
ctr = countMCalls(funs = c("dnorm", "rnorm"))
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()

See inst/profilingEg/ for an example of how to use this with profiling information.

Call Stack

It can be useful to collect the call stack so that we can see from where it was called. From eg.R,

source("eg.R")
st = genStackCollector(num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

To get just the names of the functions being called (and not the actual calls and arguments), we use callNames as a filtering/preprocessing function on the calls before we store them:

st = genStackCollector(callNames, num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Latest commit

History

34 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

When profiling code, the Rprof() function tells you how much time was spent in each function. Those functions that consume the most time are the most obvious candidates for making faster. However, it is also useful or important to know how often these functions were called. If we have two functions A and B, each consuming 60 minutes in the profiling, but A is called once and B is called 6 million times, often we might focus on A.

To count the number of times a particular function is called, we can use trace(), e.g.,

trace(attr, incrementAttrCounter)

incrementAttrCounter would be a function that adds one to a variable that we use to count the number of times attr() is called. Even better, we define a closure to create a generic, reusable counter

mkCounter =
function()
{
ctr = 0L
inc = function() ctr <<- ctr + 1L
list(inc = inc, value = function() ctr, reset = function() ctr <<- 0L)
}

Now we can use

attrCtr = mkCounter()
trace(attr, attrCtr$inc)

Then we run our code and when it finishes, we query the number of times attr() was called with

attrCtr$value()

If we want to count the number of calls to several functions, we can create a separate counter closure for each. Alternatively, we can create a single counter that keeps the counts for all of the functions in a named vector. Instead of passing the incrementing function to trace(), we call the incrementing function with the name of the function and then update the corresponding named element in our vector of counts, e.g.,

trace(dnorm, quote(ctr$inc("dnorm")))
trace(rnorm, quote(ctr$inc("rnorm")))

Rather than have the user explicitly create the counters and call trace(), this package provides higher-level functions to do these steps for you. For counting calls to a single function, use countCalls(), e.g.,

ctr = countMCalls(rnorm)
replicate(10, rnorm(0))
ctr$value()

For counting calls to multiple functions, use countMCalls(), e.g.,

ctr = countMCalls(dnorm, rnorm)
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()
ctr = countMCalls(funs = c("dnorm", "rnorm"))
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()

See inst/profilingEg/ for an example of how to use this with profiling information.

Call Stack

It can be useful to collect the call stack so that we can see from where it was called. From eg.R,

source("eg.R")
st = genStackCollector(num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

To get just the names of the functions being called (and not the actual calls and arguments), we use callNames as a filtering/preprocessing function on the calls before we store them:

st = genStackCollector(callNames, num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Latest commit

History

34 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

When profiling code, the Rprof() function tells you how much time was spent in each function. Those functions that consume the most time are the most obvious candidates for making faster. However, it is also useful or important to know how often these functions were called. If we have two functions A and B, each consuming 60 minutes in the profiling, but A is called once and B is called 6 million times, often we might focus on A.

To count the number of times a particular function is called, we can use trace(), e.g.,

trace(attr, incrementAttrCounter)

incrementAttrCounter would be a function that adds one to a variable that we use to count the number of times attr() is called. Even better, we define a closure to create a generic, reusable counter

mkCounter =
function()
{
ctr = 0L
inc = function() ctr <<- ctr + 1L
list(inc = inc, value = function() ctr, reset = function() ctr <<- 0L)
}

Now we can use

attrCtr = mkCounter()
trace(attr, attrCtr$inc)

Then we run our code and when it finishes, we query the number of times attr() was called with

attrCtr$value()

If we want to count the number of calls to several functions, we can create a separate counter closure for each. Alternatively, we can create a single counter that keeps the counts for all of the functions in a named vector. Instead of passing the incrementing function to trace(), we call the incrementing function with the name of the function and then update the corresponding named element in our vector of counts, e.g.,

trace(dnorm, quote(ctr$inc("dnorm")))
trace(rnorm, quote(ctr$inc("rnorm")))

Rather than have the user explicitly create the counters and call trace(), this package provides higher-level functions to do these steps for you. For counting calls to a single function, use countCalls(), e.g.,

ctr = countMCalls(rnorm)
replicate(10, rnorm(0))
ctr$value()

For counting calls to multiple functions, use countMCalls(), e.g.,

ctr = countMCalls(dnorm, rnorm)
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()
ctr = countMCalls(funs = c("dnorm", "rnorm"))
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()

See inst/profilingEg/ for an example of how to use this with profiling information.

Call Stack

It can be useful to collect the call stack so that we can see from where it was called. From eg.R,

source("eg.R")
st = genStackCollector(num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

To get just the names of the functions being called (and not the actual calls and arguments), we use callNames as a filtering/preprocessing function on the calls before we store them:

st = genStackCollector(callNames, num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Latest commit

History

34 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

When profiling code, the Rprof() function tells you how much time was spent in each function. Those functions that consume the most time are the most obvious candidates for making faster. However, it is also useful or important to know how often these functions were called. If we have two functions A and B, each consuming 60 minutes in the profiling, but A is called once and B is called 6 million times, often we might focus on A.

To count the number of times a particular function is called, we can use trace(), e.g.,

trace(attr, incrementAttrCounter)

incrementAttrCounter would be a function that adds one to a variable that we use to count the number of times attr() is called. Even better, we define a closure to create a generic, reusable counter

mkCounter =
function()
{
ctr = 0L
inc = function() ctr <<- ctr + 1L
list(inc = inc, value = function() ctr, reset = function() ctr <<- 0L)
}

Now we can use

attrCtr = mkCounter()
trace(attr, attrCtr$inc)

Then we run our code and when it finishes, we query the number of times attr() was called with

attrCtr$value()

If we want to count the number of calls to several functions, we can create a separate counter closure for each. Alternatively, we can create a single counter that keeps the counts for all of the functions in a named vector. Instead of passing the incrementing function to trace(), we call the incrementing function with the name of the function and then update the corresponding named element in our vector of counts, e.g.,

trace(dnorm, quote(ctr$inc("dnorm")))
trace(rnorm, quote(ctr$inc("rnorm")))

Rather than have the user explicitly create the counters and call trace(), this package provides higher-level functions to do these steps for you. For counting calls to a single function, use countCalls(), e.g.,

ctr = countMCalls(rnorm)
replicate(10, rnorm(0))
ctr$value()

For counting calls to multiple functions, use countMCalls(), e.g.,

ctr = countMCalls(dnorm, rnorm)
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()
ctr = countMCalls(funs = c("dnorm", "rnorm"))
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()

See inst/profilingEg/ for an example of how to use this with profiling information.

Call Stack

It can be useful to collect the call stack so that we can see from where it was called. From eg.R,

source("eg.R")
st = genStackCollector(num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

To get just the names of the functions being called (and not the actual calls and arguments), we use callNames as a filtering/preprocessing function on the calls before we store them:

st = genStackCollector(callNames, num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, '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

Latest commit

History

34 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

When profiling code, the Rprof() function tells you how much time was spent in each function. Those functions that consume the most time are the most obvious candidates for making faster. However, it is also useful or important to know how often these functions were called. If we have two functions A and B, each consuming 60 minutes in the profiling, but A is called once and B is called 6 million times, often we might focus on A.

To count the number of times a particular function is called, we can use trace(), e.g.,

trace(attr, incrementAttrCounter)

incrementAttrCounter would be a function that adds one to a variable that we use to count the number of times attr() is called. Even better, we define a closure to create a generic, reusable counter

mkCounter =
function()
{
ctr = 0L
inc = function() ctr <<- ctr + 1L
list(inc = inc, value = function() ctr, reset = function() ctr <<- 0L)
}

Now we can use

attrCtr = mkCounter()
trace(attr, attrCtr$inc)

Then we run our code and when it finishes, we query the number of times attr() was called with

attrCtr$value()

If we want to count the number of calls to several functions, we can create a separate counter closure for each. Alternatively, we can create a single counter that keeps the counts for all of the functions in a named vector. Instead of passing the incrementing function to trace(), we call the incrementing function with the name of the function and then update the corresponding named element in our vector of counts, e.g.,

trace(dnorm, quote(ctr$inc("dnorm")))
trace(rnorm, quote(ctr$inc("rnorm")))

Rather than have the user explicitly create the counters and call trace(), this package provides higher-level functions to do these steps for you. For counting calls to a single function, use countCalls(), e.g.,

ctr = countMCalls(rnorm)
replicate(10, rnorm(0))
ctr$value()

For counting calls to multiple functions, use countMCalls(), e.g.,

ctr = countMCalls(dnorm, rnorm)
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()
ctr = countMCalls(funs = c("dnorm", "rnorm"))
replicate(10, dnorm(0))
replicate(7, rnorm(1))
dnorm(1)
ctr$value()

See inst/profilingEg/ for an example of how to use this with profiling information.

Call Stack

It can be useful to collect the call stack so that we can see from where it was called. From eg.R,

source("eg.R")
st = genStackCollector(num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

To get just the names of the functions being called (and not the actual calls and arguments), we use callNames as a filtering/preprocessing function on the calls before we store them:

st = genStackCollector(callNames, num = 500)
trace(f, st$update, print = FALSE)
invisible ( k() )
z = st$value()
z[[1]]

About

No description, website, or topics provided.

Resources

Stars

3 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages