Skip to content

For perf, remove Invoker pattern for fields - #74614

Merged
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf
Aug 27, 2022
Merged

For perf, remove Invoker pattern for fields#74614
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf

Conversation

@steveharter

@stevehartersteveharter commented Aug 25, 2022

Copy link
Copy Markdown
Contributor

Fixes#74550 by removing overhead added by the Invoker pattern which is unnecessary until IL emit support is added for fields.

Brings field getter to even with 6.0, and setter about 10% faster.

Suggest porting this to 7.0

For 8.0, this change will eventually be reverted and the corresponding IL emitted for field access.

Before:

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|-----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 30.993 ns | 0.1622 ns | 0.1438 ns | 30.972 ns | 30.768 ns | 31.259 ns | 0.87 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 35.749 ns | 0.2806 ns | 0.2487 ns | 35.752 ns | 35.461 ns | 36.344 ns | 1.00 | 0.00 | 0.0021 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 36.037 ns | 0.2146 ns | 0.1903 ns | 36.018 ns | 35.744 ns | 36.418 ns | 0.98 | 0.01 | 0.0023 | 24 B | 1.00 |
| Field_Set_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 36.766 ns | 0.2736 ns | 0.2425 ns | 36.666 ns | 36.378 ns | 37.268 ns | 1.00 | 0.00 | 0.0023 | 24 B | 1.00 |

After

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 34.137 ns | 0.5458 ns | 0.4839 ns | 34.074 ns | 33.391 ns | 35.035 ns | 1.00 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 34.164 ns | 0.0963 ns | 0.0854 ns | 34.169 ns | 33.972 ns | 34.275 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 37.470 ns | 0.9993 ns | 1.1107 ns | 36.990 ns | 36.026 ns | 40.156 ns | 1.13 | 0.04 | 0.0022 | 24 B | 1.00 |
| Field_Set_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 33.512 ns | 0.1265 ns | 0.1056 ns | 33.506 ns | 33.369 ns | 33.780 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |

@stevehartersteveharter self-assigned this Aug 25, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-reflection
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:steveharter
Assignees:steveharter
Labels:

area-System.Reflection

Milestone:-

@steveharter
steveharter marked this pull request as ready for review August 26, 2022 18:40

@buyaa-nbuyaa-n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@steveharter
steveharter merged commit 13d8d2e into dotnet:mainAug 27, 2022
@steveharter
steveharter deleted the FieldPerf branch August 27, 2022 00:59
@steveharter

Copy link
Copy Markdown
ContributorAuthor

/backport to release/7.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/7.0: https://github.com/dotnet/runtime/actions/runs/2937474963

@danmoseley

Copy link
Copy Markdown
Contributor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

@steveharter

Copy link
Copy Markdown
ContributorAuthor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

Yes the existing (but new) benchmarks in the perf repo cover this. One item to consider however is that they are currently only based on an int field and thus could be expanded to reference types.

steveharter added a commit to steveharter/runtime that referenced this pull request Sep 19, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 28, 2022
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.

.NET 6 vs .NET 7 reflection performance regression

4 participants

@steveharter@danmoseley@jkotas@buyaa-n
, '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" + '
For perf, remove Invoker pattern for fields by steveharter · Pull Request #74614 · dotnet/runtime · GitHub
Skip to content

For perf, remove Invoker pattern for fields - #74614

Merged
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf
Aug 27, 2022
Merged

For perf, remove Invoker pattern for fields#74614
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf

Conversation

@steveharter

@stevehartersteveharter commented Aug 25, 2022

Copy link
Copy Markdown
Contributor

Fixes#74550 by removing overhead added by the Invoker pattern which is unnecessary until IL emit support is added for fields.

Brings field getter to even with 6.0, and setter about 10% faster.

Suggest porting this to 7.0

For 8.0, this change will eventually be reverted and the corresponding IL emitted for field access.

Before:

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|-----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 30.993 ns | 0.1622 ns | 0.1438 ns | 30.972 ns | 30.768 ns | 31.259 ns | 0.87 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 35.749 ns | 0.2806 ns | 0.2487 ns | 35.752 ns | 35.461 ns | 36.344 ns | 1.00 | 0.00 | 0.0021 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 36.037 ns | 0.2146 ns | 0.1903 ns | 36.018 ns | 35.744 ns | 36.418 ns | 0.98 | 0.01 | 0.0023 | 24 B | 1.00 |
| Field_Set_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 36.766 ns | 0.2736 ns | 0.2425 ns | 36.666 ns | 36.378 ns | 37.268 ns | 1.00 | 0.00 | 0.0023 | 24 B | 1.00 |

After

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 34.137 ns | 0.5458 ns | 0.4839 ns | 34.074 ns | 33.391 ns | 35.035 ns | 1.00 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 34.164 ns | 0.0963 ns | 0.0854 ns | 34.169 ns | 33.972 ns | 34.275 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 37.470 ns | 0.9993 ns | 1.1107 ns | 36.990 ns | 36.026 ns | 40.156 ns | 1.13 | 0.04 | 0.0022 | 24 B | 1.00 |
| Field_Set_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 33.512 ns | 0.1265 ns | 0.1056 ns | 33.506 ns | 33.369 ns | 33.780 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |

@stevehartersteveharter self-assigned this Aug 25, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-reflection
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:steveharter
Assignees:steveharter
Labels:

area-System.Reflection

Milestone:-

@steveharter
steveharter marked this pull request as ready for review August 26, 2022 18:40

@buyaa-nbuyaa-n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@steveharter
steveharter merged commit 13d8d2e into dotnet:mainAug 27, 2022
@steveharter
steveharter deleted the FieldPerf branch August 27, 2022 00:59
@steveharter

Copy link
Copy Markdown
ContributorAuthor

/backport to release/7.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/7.0: https://github.com/dotnet/runtime/actions/runs/2937474963

@danmoseley

Copy link
Copy Markdown
Contributor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

@steveharter

Copy link
Copy Markdown
ContributorAuthor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

Yes the existing (but new) benchmarks in the perf repo cover this. One item to consider however is that they are currently only based on an int field and thus could be expanded to reference types.

steveharter added a commit to steveharter/runtime that referenced this pull request Sep 19, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 28, 2022
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.

.NET 6 vs .NET 7 reflection performance regression

4 participants

@steveharter@danmoseley@jkotas@buyaa-n
, '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('^' + ".*" + ' For perf, remove Invoker pattern for fields by steveharter · Pull Request #74614 · dotnet/runtime · GitHub
Skip to content

For perf, remove Invoker pattern for fields - #74614

Merged
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf
Aug 27, 2022
Merged

For perf, remove Invoker pattern for fields#74614
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf

Conversation

@steveharter

@stevehartersteveharter commented Aug 25, 2022

Copy link
Copy Markdown
Contributor

Fixes#74550 by removing overhead added by the Invoker pattern which is unnecessary until IL emit support is added for fields.

Brings field getter to even with 6.0, and setter about 10% faster.

Suggest porting this to 7.0

For 8.0, this change will eventually be reverted and the corresponding IL emitted for field access.

Before:

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|-----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 30.993 ns | 0.1622 ns | 0.1438 ns | 30.972 ns | 30.768 ns | 31.259 ns | 0.87 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 35.749 ns | 0.2806 ns | 0.2487 ns | 35.752 ns | 35.461 ns | 36.344 ns | 1.00 | 0.00 | 0.0021 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 36.037 ns | 0.2146 ns | 0.1903 ns | 36.018 ns | 35.744 ns | 36.418 ns | 0.98 | 0.01 | 0.0023 | 24 B | 1.00 |
| Field_Set_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 36.766 ns | 0.2736 ns | 0.2425 ns | 36.666 ns | 36.378 ns | 37.268 ns | 1.00 | 0.00 | 0.0023 | 24 B | 1.00 |

After

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 34.137 ns | 0.5458 ns | 0.4839 ns | 34.074 ns | 33.391 ns | 35.035 ns | 1.00 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 34.164 ns | 0.0963 ns | 0.0854 ns | 34.169 ns | 33.972 ns | 34.275 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 37.470 ns | 0.9993 ns | 1.1107 ns | 36.990 ns | 36.026 ns | 40.156 ns | 1.13 | 0.04 | 0.0022 | 24 B | 1.00 |
| Field_Set_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 33.512 ns | 0.1265 ns | 0.1056 ns | 33.506 ns | 33.369 ns | 33.780 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |

@stevehartersteveharter self-assigned this Aug 25, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-reflection
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:steveharter
Assignees:steveharter
Labels:

area-System.Reflection

Milestone:-

@steveharter
steveharter marked this pull request as ready for review August 26, 2022 18:40

@buyaa-nbuyaa-n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@steveharter
steveharter merged commit 13d8d2e into dotnet:mainAug 27, 2022
@steveharter
steveharter deleted the FieldPerf branch August 27, 2022 00:59
@steveharter

Copy link
Copy Markdown
ContributorAuthor

/backport to release/7.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/7.0: https://github.com/dotnet/runtime/actions/runs/2937474963

@danmoseley

Copy link
Copy Markdown
Contributor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

@steveharter

Copy link
Copy Markdown
ContributorAuthor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

Yes the existing (but new) benchmarks in the perf repo cover this. One item to consider however is that they are currently only based on an int field and thus could be expanded to reference types.

steveharter added a commit to steveharter/runtime that referenced this pull request Sep 19, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 28, 2022
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.

.NET 6 vs .NET 7 reflection performance regression

4 participants

@steveharter@danmoseley@jkotas@buyaa-n
, '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('^' + ".*" + ' For perf, remove Invoker pattern for fields by steveharter · Pull Request #74614 · dotnet/runtime · GitHub
Skip to content

For perf, remove Invoker pattern for fields - #74614

Merged
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf
Aug 27, 2022
Merged

For perf, remove Invoker pattern for fields#74614
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf

Conversation

@steveharter

@stevehartersteveharter commented Aug 25, 2022

Copy link
Copy Markdown
Contributor

Fixes#74550 by removing overhead added by the Invoker pattern which is unnecessary until IL emit support is added for fields.

Brings field getter to even with 6.0, and setter about 10% faster.

Suggest porting this to 7.0

For 8.0, this change will eventually be reverted and the corresponding IL emitted for field access.

Before:

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|-----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 30.993 ns | 0.1622 ns | 0.1438 ns | 30.972 ns | 30.768 ns | 31.259 ns | 0.87 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 35.749 ns | 0.2806 ns | 0.2487 ns | 35.752 ns | 35.461 ns | 36.344 ns | 1.00 | 0.00 | 0.0021 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 36.037 ns | 0.2146 ns | 0.1903 ns | 36.018 ns | 35.744 ns | 36.418 ns | 0.98 | 0.01 | 0.0023 | 24 B | 1.00 |
| Field_Set_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 36.766 ns | 0.2736 ns | 0.2425 ns | 36.666 ns | 36.378 ns | 37.268 ns | 1.00 | 0.00 | 0.0023 | 24 B | 1.00 |

After

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 34.137 ns | 0.5458 ns | 0.4839 ns | 34.074 ns | 33.391 ns | 35.035 ns | 1.00 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 34.164 ns | 0.0963 ns | 0.0854 ns | 34.169 ns | 33.972 ns | 34.275 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 37.470 ns | 0.9993 ns | 1.1107 ns | 36.990 ns | 36.026 ns | 40.156 ns | 1.13 | 0.04 | 0.0022 | 24 B | 1.00 |
| Field_Set_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 33.512 ns | 0.1265 ns | 0.1056 ns | 33.506 ns | 33.369 ns | 33.780 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |

@stevehartersteveharter self-assigned this Aug 25, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-reflection
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:steveharter
Assignees:steveharter
Labels:

area-System.Reflection

Milestone:-

@steveharter
steveharter marked this pull request as ready for review August 26, 2022 18:40

@buyaa-nbuyaa-n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@steveharter
steveharter merged commit 13d8d2e into dotnet:mainAug 27, 2022
@steveharter
steveharter deleted the FieldPerf branch August 27, 2022 00:59
@steveharter

Copy link
Copy Markdown
ContributorAuthor

/backport to release/7.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/7.0: https://github.com/dotnet/runtime/actions/runs/2937474963

@danmoseley

Copy link
Copy Markdown
Contributor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

@steveharter

Copy link
Copy Markdown
ContributorAuthor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

Yes the existing (but new) benchmarks in the perf repo cover this. One item to consider however is that they are currently only based on an int field and thus could be expanded to reference types.

steveharter added a commit to steveharter/runtime that referenced this pull request Sep 19, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 28, 2022
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.

.NET 6 vs .NET 7 reflection performance regression

4 participants

@steveharter@danmoseley@jkotas@buyaa-n
, '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" + ' For perf, remove Invoker pattern for fields by steveharter · Pull Request #74614 · dotnet/runtime · GitHub
Skip to content

For perf, remove Invoker pattern for fields - #74614

Merged
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf
Aug 27, 2022
Merged

For perf, remove Invoker pattern for fields#74614
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf

Conversation

@steveharter

@stevehartersteveharter commented Aug 25, 2022

Copy link
Copy Markdown
Contributor

Fixes#74550 by removing overhead added by the Invoker pattern which is unnecessary until IL emit support is added for fields.

Brings field getter to even with 6.0, and setter about 10% faster.

Suggest porting this to 7.0

For 8.0, this change will eventually be reverted and the corresponding IL emitted for field access.

Before:

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|-----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 30.993 ns | 0.1622 ns | 0.1438 ns | 30.972 ns | 30.768 ns | 31.259 ns | 0.87 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 35.749 ns | 0.2806 ns | 0.2487 ns | 35.752 ns | 35.461 ns | 36.344 ns | 1.00 | 0.00 | 0.0021 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 36.037 ns | 0.2146 ns | 0.1903 ns | 36.018 ns | 35.744 ns | 36.418 ns | 0.98 | 0.01 | 0.0023 | 24 B | 1.00 |
| Field_Set_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 36.766 ns | 0.2736 ns | 0.2425 ns | 36.666 ns | 36.378 ns | 37.268 ns | 1.00 | 0.00 | 0.0023 | 24 B | 1.00 |

After

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 34.137 ns | 0.5458 ns | 0.4839 ns | 34.074 ns | 33.391 ns | 35.035 ns | 1.00 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 34.164 ns | 0.0963 ns | 0.0854 ns | 34.169 ns | 33.972 ns | 34.275 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 37.470 ns | 0.9993 ns | 1.1107 ns | 36.990 ns | 36.026 ns | 40.156 ns | 1.13 | 0.04 | 0.0022 | 24 B | 1.00 |
| Field_Set_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 33.512 ns | 0.1265 ns | 0.1056 ns | 33.506 ns | 33.369 ns | 33.780 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |

@stevehartersteveharter self-assigned this Aug 25, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-reflection
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:steveharter
Assignees:steveharter
Labels:

area-System.Reflection

Milestone:-

@steveharter
steveharter marked this pull request as ready for review August 26, 2022 18:40

@buyaa-nbuyaa-n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@steveharter
steveharter merged commit 13d8d2e into dotnet:mainAug 27, 2022
@steveharter
steveharter deleted the FieldPerf branch August 27, 2022 00:59
@steveharter

Copy link
Copy Markdown
ContributorAuthor

/backport to release/7.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/7.0: https://github.com/dotnet/runtime/actions/runs/2937474963

@danmoseley

Copy link
Copy Markdown
Contributor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

@steveharter

Copy link
Copy Markdown
ContributorAuthor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

Yes the existing (but new) benchmarks in the perf repo cover this. One item to consider however is that they are currently only based on an int field and thus could be expanded to reference types.

steveharter added a commit to steveharter/runtime that referenced this pull request Sep 19, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 28, 2022
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.

.NET 6 vs .NET 7 reflection performance regression

4 participants

@steveharter@danmoseley@jkotas@buyaa-n
, '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('^' + ".*" + ' For perf, remove Invoker pattern for fields by steveharter · Pull Request #74614 · dotnet/runtime · GitHub
Skip to content

For perf, remove Invoker pattern for fields - #74614

Merged
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf
Aug 27, 2022
Merged

For perf, remove Invoker pattern for fields#74614
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf

Conversation

@steveharter

@stevehartersteveharter commented Aug 25, 2022

Copy link
Copy Markdown
Contributor

Fixes#74550 by removing overhead added by the Invoker pattern which is unnecessary until IL emit support is added for fields.

Brings field getter to even with 6.0, and setter about 10% faster.

Suggest porting this to 7.0

For 8.0, this change will eventually be reverted and the corresponding IL emitted for field access.

Before:

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|-----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 30.993 ns | 0.1622 ns | 0.1438 ns | 30.972 ns | 30.768 ns | 31.259 ns | 0.87 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 35.749 ns | 0.2806 ns | 0.2487 ns | 35.752 ns | 35.461 ns | 36.344 ns | 1.00 | 0.00 | 0.0021 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 36.037 ns | 0.2146 ns | 0.1903 ns | 36.018 ns | 35.744 ns | 36.418 ns | 0.98 | 0.01 | 0.0023 | 24 B | 1.00 |
| Field_Set_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 36.766 ns | 0.2736 ns | 0.2425 ns | 36.666 ns | 36.378 ns | 37.268 ns | 1.00 | 0.00 | 0.0023 | 24 B | 1.00 |

After

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 34.137 ns | 0.5458 ns | 0.4839 ns | 34.074 ns | 33.391 ns | 35.035 ns | 1.00 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 34.164 ns | 0.0963 ns | 0.0854 ns | 34.169 ns | 33.972 ns | 34.275 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 37.470 ns | 0.9993 ns | 1.1107 ns | 36.990 ns | 36.026 ns | 40.156 ns | 1.13 | 0.04 | 0.0022 | 24 B | 1.00 |
| Field_Set_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 33.512 ns | 0.1265 ns | 0.1056 ns | 33.506 ns | 33.369 ns | 33.780 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |

@stevehartersteveharter self-assigned this Aug 25, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-reflection
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:steveharter
Assignees:steveharter
Labels:

area-System.Reflection

Milestone:-

@steveharter
steveharter marked this pull request as ready for review August 26, 2022 18:40

@buyaa-nbuyaa-n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@steveharter
steveharter merged commit 13d8d2e into dotnet:mainAug 27, 2022
@steveharter
steveharter deleted the FieldPerf branch August 27, 2022 00:59
@steveharter

Copy link
Copy Markdown
ContributorAuthor

/backport to release/7.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/7.0: https://github.com/dotnet/runtime/actions/runs/2937474963

@danmoseley

Copy link
Copy Markdown
Contributor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

@steveharter

Copy link
Copy Markdown
ContributorAuthor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

Yes the existing (but new) benchmarks in the perf repo cover this. One item to consider however is that they are currently only based on an int field and thus could be expanded to reference types.

steveharter added a commit to steveharter/runtime that referenced this pull request Sep 19, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 28, 2022
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.

.NET 6 vs .NET 7 reflection performance regression

4 participants

@steveharter@danmoseley@jkotas@buyaa-n
, '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('^' + ".*" + ' For perf, remove Invoker pattern for fields by steveharter · Pull Request #74614 · dotnet/runtime · GitHub
Skip to content

For perf, remove Invoker pattern for fields - #74614

Merged
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf
Aug 27, 2022
Merged

For perf, remove Invoker pattern for fields#74614
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf

Conversation

@steveharter

@stevehartersteveharter commented Aug 25, 2022

Copy link
Copy Markdown
Contributor

Fixes#74550 by removing overhead added by the Invoker pattern which is unnecessary until IL emit support is added for fields.

Brings field getter to even with 6.0, and setter about 10% faster.

Suggest porting this to 7.0

For 8.0, this change will eventually be reverted and the corresponding IL emitted for field access.

Before:

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|-----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 30.993 ns | 0.1622 ns | 0.1438 ns | 30.972 ns | 30.768 ns | 31.259 ns | 0.87 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 35.749 ns | 0.2806 ns | 0.2487 ns | 35.752 ns | 35.461 ns | 36.344 ns | 1.00 | 0.00 | 0.0021 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 36.037 ns | 0.2146 ns | 0.1903 ns | 36.018 ns | 35.744 ns | 36.418 ns | 0.98 | 0.01 | 0.0023 | 24 B | 1.00 |
| Field_Set_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 36.766 ns | 0.2736 ns | 0.2425 ns | 36.666 ns | 36.378 ns | 37.268 ns | 1.00 | 0.00 | 0.0023 | 24 B | 1.00 |

After

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 34.137 ns | 0.5458 ns | 0.4839 ns | 34.074 ns | 33.391 ns | 35.035 ns | 1.00 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 34.164 ns | 0.0963 ns | 0.0854 ns | 34.169 ns | 33.972 ns | 34.275 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 37.470 ns | 0.9993 ns | 1.1107 ns | 36.990 ns | 36.026 ns | 40.156 ns | 1.13 | 0.04 | 0.0022 | 24 B | 1.00 |
| Field_Set_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 33.512 ns | 0.1265 ns | 0.1056 ns | 33.506 ns | 33.369 ns | 33.780 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |

@stevehartersteveharter self-assigned this Aug 25, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-reflection
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:steveharter
Assignees:steveharter
Labels:

area-System.Reflection

Milestone:-

@steveharter
steveharter marked this pull request as ready for review August 26, 2022 18:40

@buyaa-nbuyaa-n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@steveharter
steveharter merged commit 13d8d2e into dotnet:mainAug 27, 2022
@steveharter
steveharter deleted the FieldPerf branch August 27, 2022 00:59
@steveharter

Copy link
Copy Markdown
ContributorAuthor

/backport to release/7.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/7.0: https://github.com/dotnet/runtime/actions/runs/2937474963

@danmoseley

Copy link
Copy Markdown
Contributor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

@steveharter

Copy link
Copy Markdown
ContributorAuthor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

Yes the existing (but new) benchmarks in the perf repo cover this. One item to consider however is that they are currently only based on an int field and thus could be expanded to reference types.

steveharter added a commit to steveharter/runtime that referenced this pull request Sep 19, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 28, 2022
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.

.NET 6 vs .NET 7 reflection performance regression

4 participants

@steveharter@danmoseley@jkotas@buyaa-n
, '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); } })(); })(); For perf, remove Invoker pattern for fields by steveharter · Pull Request #74614 · dotnet/runtime · GitHub
Skip to content

For perf, remove Invoker pattern for fields - #74614

Merged
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf
Aug 27, 2022
Merged

For perf, remove Invoker pattern for fields#74614
steveharter merged 3 commits into
dotnet:mainfrom
steveharter:FieldPerf

Conversation

@steveharter

@stevehartersteveharter commented Aug 25, 2022

Copy link
Copy Markdown
Contributor

Fixes#74550 by removing overhead added by the Invoker pattern which is unnecessary until IL emit support is added for fields.

Brings field getter to even with 6.0, and setter about 10% faster.

Suggest porting this to 7.0

For 8.0, this change will eventually be reverted and the corresponding IL emitted for field access.

Before:

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|-----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 30.993 ns | 0.1622 ns | 0.1438 ns | 30.972 ns | 30.768 ns | 31.259 ns | 0.87 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 35.749 ns | 0.2806 ns | 0.2487 ns | 35.752 ns | 35.461 ns | 36.344 ns | 1.00 | 0.00 | 0.0021 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-BQDNCA | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 36.037 ns | 0.2146 ns | 0.1903 ns | 36.018 ns | 35.744 ns | 36.418 ns | 0.98 | 0.01 | 0.0023 | 24 B | 1.00 |
| Field_Set_int | Job-RQCXYM | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\7.0.0\corerun.exe | 36.766 ns | 0.2736 ns | 0.2425 ns | 36.666 ns | 36.378 ns | 37.268 ns | 1.00 | 0.00 | 0.0023 | 24 B | 1.00 |

After

| Method | Job | Toolchain | Mean | Error | StdDev | Median | Min | Max | Ratio | RatioSD | Gen 0 | Allocated | Alloc Ratio |
|----------------------------------------------------- |----------- |------------------------------------------------------------------------------------------------------------ |-----------:|----------:|----------:|-----------:|-----------:|-----------:|------:|--------:|-------:|----------:|------------:|
| Field_Get_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 34.137 ns | 0.5458 ns | 0.4839 ns | 34.074 ns | 33.391 ns | 35.035 ns | 1.00 | 0.01 | 0.0022 | 24 B | 1.00 |
| Field_Get_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 34.164 ns | 0.0963 ns | 0.0854 ns | 34.169 ns | 33.972 ns | 34.275 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |
| | | | | | | | | | | | | | |
| Field_Set_int | Job-ELBTUN | \runtime60\artifacts\bin\testhost\net6.0-windows-Release-x64\shared\Microsoft.NETCore.App\6.0.9\corerun.exe | 37.470 ns | 0.9993 ns | 1.1107 ns | 36.990 ns | 36.026 ns | 40.156 ns | 1.13 | 0.04 | 0.0022 | 24 B | 1.00 |
| Field_Set_int | Job-XYBTNI | \runtime\artifacts\bin\testhost\net7.0-windows-Release-x64\shared\Microsoft.NETCore.App\8.0.0\corerun.exe | 33.512 ns | 0.1265 ns | 0.1056 ns | 33.506 ns | 33.369 ns | 33.780 ns | 1.00 | 0.00 | 0.0022 | 24 B | 1.00 |

@stevehartersteveharter self-assigned this Aug 25, 2022
@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @dotnet/area-system-reflection
See info in area-owners.md if you want to be subscribed.

Issue Details

null

Author:steveharter
Assignees:steveharter
Labels:

area-System.Reflection

Milestone:-

@steveharter
steveharter marked this pull request as ready for review August 26, 2022 18:40

@buyaa-nbuyaa-n left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM

@steveharter
steveharter merged commit 13d8d2e into dotnet:mainAug 27, 2022
@steveharter
steveharter deleted the FieldPerf branch August 27, 2022 00:59
@steveharter

Copy link
Copy Markdown
ContributorAuthor

/backport to release/7.0

@github-actions

Copy link
Copy Markdown
Contributor

Started backporting to release/7.0: https://github.com/dotnet/runtime/actions/runs/2937474963

@danmoseley

Copy link
Copy Markdown
Contributor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

@steveharter

Copy link
Copy Markdown
ContributorAuthor

@steveharter Do we have appropriate coverage in the perf repo (I saw this was customer reported)

Yes the existing (but new) benchmarks in the perf repo cover this. One item to consider however is that they are currently only based on an int field and thus could be expanded to reference types.

steveharter added a commit to steveharter/runtime that referenced this pull request Sep 19, 2022
@ghostghost locked as resolved and limited conversation to collaborators Sep 28, 2022
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.

.NET 6 vs .NET 7 reflection performance regression

4 participants

@steveharter@danmoseley@jkotas@buyaa-n