Skip to content

Use reader/writer lock instead of mutex for ComWrappers RCW cache - #91120

Merged
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964
Aug 25, 2023
Merged

Use reader/writer lock instead of mutex for ComWrappers RCW cache#91120
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964

Conversation

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Switching to a reader/writer lock improves throughput for faster RCW look up by 4x. This was observed in a private repro associated with #90964.

Fixes#90964

@AaronRobinsonMSFT

AaronRobinsonMSFT commented Aug 25, 2023

Copy link
Copy Markdown
MemberAuthor

/cc @jkotas @dotnet/interop-contrib @manodasanW

@jkotas

Copy link
Copy Markdown
Member

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

I will need to construct one. The repro was using C#/WinRT and would be non-trivial to recreate. I will see what I can do.

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

@manodasanW

Copy link
Copy Markdown
Contributor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

I was misinformed. Sad. Okay, that needs to change.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@jkotas and @manodasanW I'm genuinely shocked at this, but converting NAOT to use a reader/writer lock makes NAOT slower for a microbenchmark. I was able to see the expected speed in the microbenchmark with CoreCLR and the reader/writer lock so it is capturing the scenario, but there is nothing to do here for NAOT.

I will work on pushing the benchmark into https://github.com/dotnet/performance.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

NAOT

native_baseline\Perf.exe
Parallel.ForEach: 409 ms.
native\Perf.exe
Parallel.ForEach: 520 ms.

CoreCLR

Perf_baseline.cmd
Parallel.ForEach: 2060 ms.
Perf.cmd
Parallel.ForEach: 428 ms.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Benchmark PR - dotnet/performance#3298

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit b09764f into dotnet:mainAug 25, 2023
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the runtime_90964 branch August 25, 2023 23:23
@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/5981298027

@ghostghost locked as resolved and limited conversation to collaborators Sep 25, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ComWrappers.GetOrCreateObjectForComInstance becomes expensive during the Get cached RCW scenario when called from multiple threads

3 participants

@AaronRobinsonMSFT@jkotas@manodasanW
, '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" + '
Use reader/writer lock instead of mutex for `ComWrappers` RCW cache by AaronRobinsonMSFT · Pull Request #91120 · dotnet/runtime · GitHub
Skip to content

Use reader/writer lock instead of mutex for ComWrappers RCW cache - #91120

Merged
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964
Aug 25, 2023
Merged

Use reader/writer lock instead of mutex for ComWrappers RCW cache#91120
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964

Conversation

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Switching to a reader/writer lock improves throughput for faster RCW look up by 4x. This was observed in a private repro associated with #90964.

Fixes#90964

@AaronRobinsonMSFT

AaronRobinsonMSFT commented Aug 25, 2023

Copy link
Copy Markdown
MemberAuthor

/cc @jkotas @dotnet/interop-contrib @manodasanW

@jkotas

Copy link
Copy Markdown
Member

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

I will need to construct one. The repro was using C#/WinRT and would be non-trivial to recreate. I will see what I can do.

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

@manodasanW

Copy link
Copy Markdown
Contributor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

I was misinformed. Sad. Okay, that needs to change.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@jkotas and @manodasanW I'm genuinely shocked at this, but converting NAOT to use a reader/writer lock makes NAOT slower for a microbenchmark. I was able to see the expected speed in the microbenchmark with CoreCLR and the reader/writer lock so it is capturing the scenario, but there is nothing to do here for NAOT.

I will work on pushing the benchmark into https://github.com/dotnet/performance.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

NAOT

native_baseline\Perf.exe
Parallel.ForEach: 409 ms.
native\Perf.exe
Parallel.ForEach: 520 ms.

CoreCLR

Perf_baseline.cmd
Parallel.ForEach: 2060 ms.
Perf.cmd
Parallel.ForEach: 428 ms.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Benchmark PR - dotnet/performance#3298

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit b09764f into dotnet:mainAug 25, 2023
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the runtime_90964 branch August 25, 2023 23:23
@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/5981298027

@ghostghost locked as resolved and limited conversation to collaborators Sep 25, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ComWrappers.GetOrCreateObjectForComInstance becomes expensive during the Get cached RCW scenario when called from multiple threads

3 participants

@AaronRobinsonMSFT@jkotas@manodasanW
, '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('^' + ".*" + ' Use reader/writer lock instead of mutex for `ComWrappers` RCW cache by AaronRobinsonMSFT · Pull Request #91120 · dotnet/runtime · GitHub
Skip to content

Use reader/writer lock instead of mutex for ComWrappers RCW cache - #91120

Merged
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964
Aug 25, 2023
Merged

Use reader/writer lock instead of mutex for ComWrappers RCW cache#91120
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964

Conversation

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Switching to a reader/writer lock improves throughput for faster RCW look up by 4x. This was observed in a private repro associated with #90964.

Fixes#90964

@AaronRobinsonMSFT

AaronRobinsonMSFT commented Aug 25, 2023

Copy link
Copy Markdown
MemberAuthor

/cc @jkotas @dotnet/interop-contrib @manodasanW

@jkotas

Copy link
Copy Markdown
Member

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

I will need to construct one. The repro was using C#/WinRT and would be non-trivial to recreate. I will see what I can do.

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

@manodasanW

Copy link
Copy Markdown
Contributor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

I was misinformed. Sad. Okay, that needs to change.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@jkotas and @manodasanW I'm genuinely shocked at this, but converting NAOT to use a reader/writer lock makes NAOT slower for a microbenchmark. I was able to see the expected speed in the microbenchmark with CoreCLR and the reader/writer lock so it is capturing the scenario, but there is nothing to do here for NAOT.

I will work on pushing the benchmark into https://github.com/dotnet/performance.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

NAOT

native_baseline\Perf.exe
Parallel.ForEach: 409 ms.
native\Perf.exe
Parallel.ForEach: 520 ms.

CoreCLR

Perf_baseline.cmd
Parallel.ForEach: 2060 ms.
Perf.cmd
Parallel.ForEach: 428 ms.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Benchmark PR - dotnet/performance#3298

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit b09764f into dotnet:mainAug 25, 2023
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the runtime_90964 branch August 25, 2023 23:23
@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/5981298027

@ghostghost locked as resolved and limited conversation to collaborators Sep 25, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ComWrappers.GetOrCreateObjectForComInstance becomes expensive during the Get cached RCW scenario when called from multiple threads

3 participants

@AaronRobinsonMSFT@jkotas@manodasanW
, '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('^' + ".*" + ' Use reader/writer lock instead of mutex for `ComWrappers` RCW cache by AaronRobinsonMSFT · Pull Request #91120 · dotnet/runtime · GitHub
Skip to content

Use reader/writer lock instead of mutex for ComWrappers RCW cache - #91120

Merged
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964
Aug 25, 2023
Merged

Use reader/writer lock instead of mutex for ComWrappers RCW cache#91120
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964

Conversation

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Switching to a reader/writer lock improves throughput for faster RCW look up by 4x. This was observed in a private repro associated with #90964.

Fixes#90964

@AaronRobinsonMSFT

AaronRobinsonMSFT commented Aug 25, 2023

Copy link
Copy Markdown
MemberAuthor

/cc @jkotas @dotnet/interop-contrib @manodasanW

@jkotas

Copy link
Copy Markdown
Member

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

I will need to construct one. The repro was using C#/WinRT and would be non-trivial to recreate. I will see what I can do.

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

@manodasanW

Copy link
Copy Markdown
Contributor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

I was misinformed. Sad. Okay, that needs to change.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@jkotas and @manodasanW I'm genuinely shocked at this, but converting NAOT to use a reader/writer lock makes NAOT slower for a microbenchmark. I was able to see the expected speed in the microbenchmark with CoreCLR and the reader/writer lock so it is capturing the scenario, but there is nothing to do here for NAOT.

I will work on pushing the benchmark into https://github.com/dotnet/performance.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

NAOT

native_baseline\Perf.exe
Parallel.ForEach: 409 ms.
native\Perf.exe
Parallel.ForEach: 520 ms.

CoreCLR

Perf_baseline.cmd
Parallel.ForEach: 2060 ms.
Perf.cmd
Parallel.ForEach: 428 ms.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Benchmark PR - dotnet/performance#3298

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit b09764f into dotnet:mainAug 25, 2023
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the runtime_90964 branch August 25, 2023 23:23
@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/5981298027

@ghostghost locked as resolved and limited conversation to collaborators Sep 25, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ComWrappers.GetOrCreateObjectForComInstance becomes expensive during the Get cached RCW scenario when called from multiple threads

3 participants

@AaronRobinsonMSFT@jkotas@manodasanW
, '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" + ' Use reader/writer lock instead of mutex for `ComWrappers` RCW cache by AaronRobinsonMSFT · Pull Request #91120 · dotnet/runtime · GitHub
Skip to content

Use reader/writer lock instead of mutex for ComWrappers RCW cache - #91120

Merged
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964
Aug 25, 2023
Merged

Use reader/writer lock instead of mutex for ComWrappers RCW cache#91120
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964

Conversation

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Switching to a reader/writer lock improves throughput for faster RCW look up by 4x. This was observed in a private repro associated with #90964.

Fixes#90964

@AaronRobinsonMSFT

AaronRobinsonMSFT commented Aug 25, 2023

Copy link
Copy Markdown
MemberAuthor

/cc @jkotas @dotnet/interop-contrib @manodasanW

@jkotas

Copy link
Copy Markdown
Member

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

I will need to construct one. The repro was using C#/WinRT and would be non-trivial to recreate. I will see what I can do.

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

@manodasanW

Copy link
Copy Markdown
Contributor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

I was misinformed. Sad. Okay, that needs to change.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@jkotas and @manodasanW I'm genuinely shocked at this, but converting NAOT to use a reader/writer lock makes NAOT slower for a microbenchmark. I was able to see the expected speed in the microbenchmark with CoreCLR and the reader/writer lock so it is capturing the scenario, but there is nothing to do here for NAOT.

I will work on pushing the benchmark into https://github.com/dotnet/performance.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

NAOT

native_baseline\Perf.exe
Parallel.ForEach: 409 ms.
native\Perf.exe
Parallel.ForEach: 520 ms.

CoreCLR

Perf_baseline.cmd
Parallel.ForEach: 2060 ms.
Perf.cmd
Parallel.ForEach: 428 ms.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Benchmark PR - dotnet/performance#3298

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit b09764f into dotnet:mainAug 25, 2023
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the runtime_90964 branch August 25, 2023 23:23
@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/5981298027

@ghostghost locked as resolved and limited conversation to collaborators Sep 25, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ComWrappers.GetOrCreateObjectForComInstance becomes expensive during the Get cached RCW scenario when called from multiple threads

3 participants

@AaronRobinsonMSFT@jkotas@manodasanW
, '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('^' + ".*" + ' Use reader/writer lock instead of mutex for `ComWrappers` RCW cache by AaronRobinsonMSFT · Pull Request #91120 · dotnet/runtime · GitHub
Skip to content

Use reader/writer lock instead of mutex for ComWrappers RCW cache - #91120

Merged
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964
Aug 25, 2023
Merged

Use reader/writer lock instead of mutex for ComWrappers RCW cache#91120
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964

Conversation

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Switching to a reader/writer lock improves throughput for faster RCW look up by 4x. This was observed in a private repro associated with #90964.

Fixes#90964

@AaronRobinsonMSFT

AaronRobinsonMSFT commented Aug 25, 2023

Copy link
Copy Markdown
MemberAuthor

/cc @jkotas @dotnet/interop-contrib @manodasanW

@jkotas

Copy link
Copy Markdown
Member

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

I will need to construct one. The repro was using C#/WinRT and would be non-trivial to recreate. I will see what I can do.

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

@manodasanW

Copy link
Copy Markdown
Contributor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

I was misinformed. Sad. Okay, that needs to change.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@jkotas and @manodasanW I'm genuinely shocked at this, but converting NAOT to use a reader/writer lock makes NAOT slower for a microbenchmark. I was able to see the expected speed in the microbenchmark with CoreCLR and the reader/writer lock so it is capturing the scenario, but there is nothing to do here for NAOT.

I will work on pushing the benchmark into https://github.com/dotnet/performance.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

NAOT

native_baseline\Perf.exe
Parallel.ForEach: 409 ms.
native\Perf.exe
Parallel.ForEach: 520 ms.

CoreCLR

Perf_baseline.cmd
Parallel.ForEach: 2060 ms.
Perf.cmd
Parallel.ForEach: 428 ms.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Benchmark PR - dotnet/performance#3298

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit b09764f into dotnet:mainAug 25, 2023
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the runtime_90964 branch August 25, 2023 23:23
@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/5981298027

@ghostghost locked as resolved and limited conversation to collaborators Sep 25, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ComWrappers.GetOrCreateObjectForComInstance becomes expensive during the Get cached RCW scenario when called from multiple threads

3 participants

@AaronRobinsonMSFT@jkotas@manodasanW
, '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); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Use reader/writer lock instead of mutex for `ComWrappers` RCW cache by AaronRobinsonMSFT · Pull Request #91120 · dotnet/runtime · GitHub
Skip to content

Use reader/writer lock instead of mutex for ComWrappers RCW cache - #91120

Merged
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964
Aug 25, 2023
Merged

Use reader/writer lock instead of mutex for ComWrappers RCW cache#91120
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964

Conversation

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Switching to a reader/writer lock improves throughput for faster RCW look up by 4x. This was observed in a private repro associated with #90964.

Fixes#90964

@AaronRobinsonMSFT

AaronRobinsonMSFT commented Aug 25, 2023

Copy link
Copy Markdown
MemberAuthor

/cc @jkotas @dotnet/interop-contrib @manodasanW

@jkotas

Copy link
Copy Markdown
Member

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

I will need to construct one. The repro was using C#/WinRT and would be non-trivial to recreate. I will see what I can do.

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

@manodasanW

Copy link
Copy Markdown
Contributor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

I was misinformed. Sad. Okay, that needs to change.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@jkotas and @manodasanW I'm genuinely shocked at this, but converting NAOT to use a reader/writer lock makes NAOT slower for a microbenchmark. I was able to see the expected speed in the microbenchmark with CoreCLR and the reader/writer lock so it is capturing the scenario, but there is nothing to do here for NAOT.

I will work on pushing the benchmark into https://github.com/dotnet/performance.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

NAOT

native_baseline\Perf.exe
Parallel.ForEach: 409 ms.
native\Perf.exe
Parallel.ForEach: 520 ms.

CoreCLR

Perf_baseline.cmd
Parallel.ForEach: 2060 ms.
Perf.cmd
Parallel.ForEach: 428 ms.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Benchmark PR - dotnet/performance#3298

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit b09764f into dotnet:mainAug 25, 2023
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the runtime_90964 branch August 25, 2023 23:23
@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/5981298027

@ghostghost locked as resolved and limited conversation to collaborators Sep 25, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ComWrappers.GetOrCreateObjectForComInstance becomes expensive during the Get cached RCW scenario when called from multiple threads

3 participants

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

Use reader/writer lock instead of mutex for ComWrappers RCW cache - #91120

Merged
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964
Aug 25, 2023
Merged

Use reader/writer lock instead of mutex for ComWrappers RCW cache#91120
AaronRobinsonMSFT merged 1 commit into
dotnet:mainfrom
AaronRobinsonMSFT:runtime_90964

Conversation

@AaronRobinsonMSFT

Copy link
Copy Markdown
Member

Switching to a reader/writer lock improves throughput for faster RCW look up by 4x. This was observed in a private repro associated with #90964.

Fixes#90964

@AaronRobinsonMSFT

AaronRobinsonMSFT commented Aug 25, 2023

Copy link
Copy Markdown
MemberAuthor

/cc @jkotas @dotnet/interop-contrib @manodasanW

@jkotas

Copy link
Copy Markdown
Member

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

I will need to construct one. The repro was using C#/WinRT and would be non-trivial to recreate. I will see what I can do.

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

@manodasanW

Copy link
Copy Markdown
Contributor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Also, it would be good to check how native AOT does on this microbenchmark.

The data structure being used in AOT is the ConditionalWeakTable. I don't think this has the same mutex issues that we had in CoreCLR.

For AOT, thoughts on the lock here for rcwCache.

I was misinformed. Sad. Okay, that needs to change.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Would it be possible to extract a repro into a microbenchmark in https://github.com/dotnet/performance?

Also, it would be good to check how native AOT does on this microbenchmark.

@jkotas and @manodasanW I'm genuinely shocked at this, but converting NAOT to use a reader/writer lock makes NAOT slower for a microbenchmark. I was able to see the expected speed in the microbenchmark with CoreCLR and the reader/writer lock so it is capturing the scenario, but there is nothing to do here for NAOT.

I will work on pushing the benchmark into https://github.com/dotnet/performance.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

NAOT

native_baseline\Perf.exe
Parallel.ForEach: 409 ms.
native\Perf.exe
Parallel.ForEach: 520 ms.

CoreCLR

Perf_baseline.cmd
Parallel.ForEach: 2060 ms.
Perf.cmd
Parallel.ForEach: 428 ms.

@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

Benchmark PR - dotnet/performance#3298

@AaronRobinsonMSFT
AaronRobinsonMSFT merged commit b09764f into dotnet:mainAug 25, 2023
@AaronRobinsonMSFT
AaronRobinsonMSFT deleted the runtime_90964 branch August 25, 2023 23:23
@AaronRobinsonMSFT

Copy link
Copy Markdown
MemberAuthor

/backport to release/8.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/8.0: https://github.com/dotnet/runtime/actions/runs/5981298027

@ghostghost locked as resolved and limited conversation to collaborators Sep 25, 2023
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ComWrappers.GetOrCreateObjectForComInstance becomes expensive during the Get cached RCW scenario when called from multiple threads

3 participants

@AaronRobinsonMSFT@jkotas@manodasanW