[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports - #99924

Merged
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1
Apr 5, 2024
Merged

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports#99924
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1

Conversation

@kg

@kgkg commented Mar 18, 2024

Copy link
Copy Markdown
Contributor

Generated JSImport/JSExport initializer does an Environment.Version check to see if we're on NET7. That check is tremendously expensive, because it fetches a CustomAttribute instance off of something in corlib, then parses the version string (parsing version strings initializes a bunch of stuff). This PR removes that check and adds a linker dependency to keep the registration method alive so it can be called when needed.

We will also need to document that DLLs (in nugets?) generated by this new version of the generator won't work on NET7 runtimes, since the relevant logic to perform automatic registration on that version.

@kgkg added the arch-wasm WebAssembly architecture label Mar 18, 2024
@kgkg added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Mar 18, 2024
@kg
kg marked this pull request as ready for review March 18, 2024 23:41
@kg

kg commented Mar 18, 2024

Copy link
Copy Markdown
ContributorAuthor

Requesting review to get feedback. I hope someone knows trimming better than me and can suggest how to fix this. Put a dependency attribute of some kind on the generated module initializer, maybe?

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 64759a1 to 8a4b7fcCompareApril 3, 2024 19:36
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Apr 3, 2024
@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 8a4b7fc to 96666c5CompareApril 3, 2024 19:42
@kgkg removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Apr 3, 2024
@kg
kg requested a review from pavelsavaraApril 3, 2024 20:58
@pavelsavara

Copy link
Copy Markdown
Member

Could you please show the generated code ?

@kg

kg commented Apr 3, 2024

Copy link
Copy Markdown
ContributorAuthor

Could you please show the generated code ?

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]unsafeclass__GeneratedInitializer{[global::System.ThreadStaticAttribute]staticboolinitialized;[global::System.Runtime.CompilerServices.ModuleInitializerAttribute,global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods|global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods,typeof(__GeneratedInitializer))]staticinternalvoid__Net7SelfInit_(){}[global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_PrepareToRender_1401412665","MainJS","RayTracer")][global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_OnClick_1317452459","MainJS","RayTracer")]staticvoid__Register_(){if(initialized||global::System.Runtime.InteropServices.RuntimeInformation.OSArchitecture!=global::System.Runtime.InteropServices.Architecture.Wasm)return;initialized=true;global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:PrepareToRender",1401412665,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.ArraySegment(global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Byte),global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32,global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32});global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:OnClick",1317452459,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Task()});}}

@pavelsavara

Copy link
Copy Markdown
Member

Let's rename __Net7SelfInit_ to something like __DontTrimRegister_. Also please update description on top of this PR.

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 9b8c760 to 77f918bCompareApril 4, 2024 14:45
@pavelsavara

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime.
I think it's OK. @lewing thoughts ?

@maraf

maraf commented Apr 5, 2024

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime. I think it's OK. @lewing thoughts ?

.NET 7 is EOL on May 14, 2024. Removing support seems reasonable to me

@pavelsavarapavelsavara added the os-browser Browser variant of arch-wasm label Apr 5, 2024
@kg
kg merged commit 0c92024 into dotnet:mainApr 5, 2024
@radekdoulik

Copy link
Copy Markdown
Member
image works nicely

matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
…exports (dotnet#99924)
Change generated JSImport/JSExport initializer to not rely on Environment.Version, for faster startup
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 12, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-System.Runtime.InteropServices.JavaScriptlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports - #99924

Merged
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1
Apr 5, 2024
Merged

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports#99924
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1

Conversation

@kg

@kgkg commented Mar 18, 2024

Copy link
Copy Markdown
Contributor

Generated JSImport/JSExport initializer does an Environment.Version check to see if we're on NET7. That check is tremendously expensive, because it fetches a CustomAttribute instance off of something in corlib, then parses the version string (parsing version strings initializes a bunch of stuff). This PR removes that check and adds a linker dependency to keep the registration method alive so it can be called when needed.

We will also need to document that DLLs (in nugets?) generated by this new version of the generator won't work on NET7 runtimes, since the relevant logic to perform automatic registration on that version.

@kgkg added the arch-wasm WebAssembly architecture label Mar 18, 2024
@kgkg added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Mar 18, 2024
@kg
kg marked this pull request as ready for review March 18, 2024 23:41
@kg

kg commented Mar 18, 2024

Copy link
Copy Markdown
ContributorAuthor

Requesting review to get feedback. I hope someone knows trimming better than me and can suggest how to fix this. Put a dependency attribute of some kind on the generated module initializer, maybe?

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 64759a1 to 8a4b7fcCompareApril 3, 2024 19:36
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Apr 3, 2024
@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 8a4b7fc to 96666c5CompareApril 3, 2024 19:42
@kgkg removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Apr 3, 2024
@kg
kg requested a review from pavelsavaraApril 3, 2024 20:58
@pavelsavara

Copy link
Copy Markdown
Member

Could you please show the generated code ?

@kg

kg commented Apr 3, 2024

Copy link
Copy Markdown
ContributorAuthor

Could you please show the generated code ?

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]unsafeclass__GeneratedInitializer{[global::System.ThreadStaticAttribute]staticboolinitialized;[global::System.Runtime.CompilerServices.ModuleInitializerAttribute,global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods|global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods,typeof(__GeneratedInitializer))]staticinternalvoid__Net7SelfInit_(){}[global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_PrepareToRender_1401412665","MainJS","RayTracer")][global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_OnClick_1317452459","MainJS","RayTracer")]staticvoid__Register_(){if(initialized||global::System.Runtime.InteropServices.RuntimeInformation.OSArchitecture!=global::System.Runtime.InteropServices.Architecture.Wasm)return;initialized=true;global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:PrepareToRender",1401412665,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.ArraySegment(global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Byte),global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32,global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32});global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:OnClick",1317452459,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Task()});}}

@pavelsavara

Copy link
Copy Markdown
Member

Let's rename __Net7SelfInit_ to something like __DontTrimRegister_. Also please update description on top of this PR.

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 9b8c760 to 77f918bCompareApril 4, 2024 14:45
@pavelsavara

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime.
I think it's OK. @lewing thoughts ?

@maraf

maraf commented Apr 5, 2024

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime. I think it's OK. @lewing thoughts ?

.NET 7 is EOL on May 14, 2024. Removing support seems reasonable to me

@pavelsavarapavelsavara added the os-browser Browser variant of arch-wasm label Apr 5, 2024
@kg
kg merged commit 0c92024 into dotnet:mainApr 5, 2024
@radekdoulik

Copy link
Copy Markdown
Member
image works nicely

matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
…exports (dotnet#99924)
Change generated JSImport/JSExport initializer to not rely on Environment.Version, for faster startup
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 12, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-System.Runtime.InteropServices.JavaScriptlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports - #99924

Merged
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1
Apr 5, 2024
Merged

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports#99924
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1

Conversation

@kg

@kgkg commented Mar 18, 2024

Copy link
Copy Markdown
Contributor

Generated JSImport/JSExport initializer does an Environment.Version check to see if we're on NET7. That check is tremendously expensive, because it fetches a CustomAttribute instance off of something in corlib, then parses the version string (parsing version strings initializes a bunch of stuff). This PR removes that check and adds a linker dependency to keep the registration method alive so it can be called when needed.

We will also need to document that DLLs (in nugets?) generated by this new version of the generator won't work on NET7 runtimes, since the relevant logic to perform automatic registration on that version.

@kgkg added the arch-wasm WebAssembly architecture label Mar 18, 2024
@kgkg added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Mar 18, 2024
@kg
kg marked this pull request as ready for review March 18, 2024 23:41
@kg

kg commented Mar 18, 2024

Copy link
Copy Markdown
ContributorAuthor

Requesting review to get feedback. I hope someone knows trimming better than me and can suggest how to fix this. Put a dependency attribute of some kind on the generated module initializer, maybe?

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 64759a1 to 8a4b7fcCompareApril 3, 2024 19:36
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Apr 3, 2024
@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 8a4b7fc to 96666c5CompareApril 3, 2024 19:42
@kgkg removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Apr 3, 2024
@kg
kg requested a review from pavelsavaraApril 3, 2024 20:58
@pavelsavara

Copy link
Copy Markdown
Member

Could you please show the generated code ?

@kg

kg commented Apr 3, 2024

Copy link
Copy Markdown
ContributorAuthor

Could you please show the generated code ?

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]unsafeclass__GeneratedInitializer{[global::System.ThreadStaticAttribute]staticboolinitialized;[global::System.Runtime.CompilerServices.ModuleInitializerAttribute,global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods|global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods,typeof(__GeneratedInitializer))]staticinternalvoid__Net7SelfInit_(){}[global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_PrepareToRender_1401412665","MainJS","RayTracer")][global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_OnClick_1317452459","MainJS","RayTracer")]staticvoid__Register_(){if(initialized||global::System.Runtime.InteropServices.RuntimeInformation.OSArchitecture!=global::System.Runtime.InteropServices.Architecture.Wasm)return;initialized=true;global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:PrepareToRender",1401412665,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.ArraySegment(global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Byte),global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32,global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32});global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:OnClick",1317452459,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Task()});}}

@pavelsavara

Copy link
Copy Markdown
Member

Let's rename __Net7SelfInit_ to something like __DontTrimRegister_. Also please update description on top of this PR.

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 9b8c760 to 77f918bCompareApril 4, 2024 14:45
@pavelsavara

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime.
I think it's OK. @lewing thoughts ?

@maraf

maraf commented Apr 5, 2024

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime. I think it's OK. @lewing thoughts ?

.NET 7 is EOL on May 14, 2024. Removing support seems reasonable to me

@pavelsavarapavelsavara added the os-browser Browser variant of arch-wasm label Apr 5, 2024
@kg
kg merged commit 0c92024 into dotnet:mainApr 5, 2024
@radekdoulik

Copy link
Copy Markdown
Member
image works nicely

matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
…exports (dotnet#99924)
Change generated JSImport/JSExport initializer to not rely on Environment.Version, for faster startup
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 12, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-System.Runtime.InteropServices.JavaScriptlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports - #99924

Merged
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1
Apr 5, 2024
Merged

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports#99924
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1

Conversation

@kg

@kgkg commented Mar 18, 2024

Copy link
Copy Markdown
Contributor

Generated JSImport/JSExport initializer does an Environment.Version check to see if we're on NET7. That check is tremendously expensive, because it fetches a CustomAttribute instance off of something in corlib, then parses the version string (parsing version strings initializes a bunch of stuff). This PR removes that check and adds a linker dependency to keep the registration method alive so it can be called when needed.

We will also need to document that DLLs (in nugets?) generated by this new version of the generator won't work on NET7 runtimes, since the relevant logic to perform automatic registration on that version.

@kgkg added the arch-wasm WebAssembly architecture label Mar 18, 2024
@kgkg added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Mar 18, 2024
@kg
kg marked this pull request as ready for review March 18, 2024 23:41
@kg

kg commented Mar 18, 2024

Copy link
Copy Markdown
ContributorAuthor

Requesting review to get feedback. I hope someone knows trimming better than me and can suggest how to fix this. Put a dependency attribute of some kind on the generated module initializer, maybe?

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 64759a1 to 8a4b7fcCompareApril 3, 2024 19:36
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Apr 3, 2024
@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 8a4b7fc to 96666c5CompareApril 3, 2024 19:42
@kgkg removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Apr 3, 2024
@kg
kg requested a review from pavelsavaraApril 3, 2024 20:58
@pavelsavara

Copy link
Copy Markdown
Member

Could you please show the generated code ?

@kg

kg commented Apr 3, 2024

Copy link
Copy Markdown
ContributorAuthor

Could you please show the generated code ?

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]unsafeclass__GeneratedInitializer{[global::System.ThreadStaticAttribute]staticboolinitialized;[global::System.Runtime.CompilerServices.ModuleInitializerAttribute,global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods|global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods,typeof(__GeneratedInitializer))]staticinternalvoid__Net7SelfInit_(){}[global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_PrepareToRender_1401412665","MainJS","RayTracer")][global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_OnClick_1317452459","MainJS","RayTracer")]staticvoid__Register_(){if(initialized||global::System.Runtime.InteropServices.RuntimeInformation.OSArchitecture!=global::System.Runtime.InteropServices.Architecture.Wasm)return;initialized=true;global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:PrepareToRender",1401412665,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.ArraySegment(global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Byte),global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32,global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32});global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:OnClick",1317452459,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Task()});}}

@pavelsavara

Copy link
Copy Markdown
Member

Let's rename __Net7SelfInit_ to something like __DontTrimRegister_. Also please update description on top of this PR.

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 9b8c760 to 77f918bCompareApril 4, 2024 14:45
@pavelsavara

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime.
I think it's OK. @lewing thoughts ?

@maraf

maraf commented Apr 5, 2024

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime. I think it's OK. @lewing thoughts ?

.NET 7 is EOL on May 14, 2024. Removing support seems reasonable to me

@pavelsavarapavelsavara added the os-browser Browser variant of arch-wasm label Apr 5, 2024
@kg
kg merged commit 0c92024 into dotnet:mainApr 5, 2024
@radekdoulik

Copy link
Copy Markdown
Member
image works nicely

matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
…exports (dotnet#99924)
Change generated JSImport/JSExport initializer to not rely on Environment.Version, for faster startup
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 12, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-System.Runtime.InteropServices.JavaScriptlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports - #99924

Merged
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1
Apr 5, 2024
Merged

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports#99924
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1

Conversation

@kg

@kgkg commented Mar 18, 2024

Copy link
Copy Markdown
Contributor

Generated JSImport/JSExport initializer does an Environment.Version check to see if we're on NET7. That check is tremendously expensive, because it fetches a CustomAttribute instance off of something in corlib, then parses the version string (parsing version strings initializes a bunch of stuff). This PR removes that check and adds a linker dependency to keep the registration method alive so it can be called when needed.

We will also need to document that DLLs (in nugets?) generated by this new version of the generator won't work on NET7 runtimes, since the relevant logic to perform automatic registration on that version.

@kgkg added the arch-wasm WebAssembly architecture label Mar 18, 2024
@kgkg added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Mar 18, 2024
@kg
kg marked this pull request as ready for review March 18, 2024 23:41
@kg

kg commented Mar 18, 2024

Copy link
Copy Markdown
ContributorAuthor

Requesting review to get feedback. I hope someone knows trimming better than me and can suggest how to fix this. Put a dependency attribute of some kind on the generated module initializer, maybe?

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 64759a1 to 8a4b7fcCompareApril 3, 2024 19:36
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Apr 3, 2024
@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 8a4b7fc to 96666c5CompareApril 3, 2024 19:42
@kgkg removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Apr 3, 2024
@kg
kg requested a review from pavelsavaraApril 3, 2024 20:58
@pavelsavara

Copy link
Copy Markdown
Member

Could you please show the generated code ?

@kg

kg commented Apr 3, 2024

Copy link
Copy Markdown
ContributorAuthor

Could you please show the generated code ?

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]unsafeclass__GeneratedInitializer{[global::System.ThreadStaticAttribute]staticboolinitialized;[global::System.Runtime.CompilerServices.ModuleInitializerAttribute,global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods|global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods,typeof(__GeneratedInitializer))]staticinternalvoid__Net7SelfInit_(){}[global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_PrepareToRender_1401412665","MainJS","RayTracer")][global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_OnClick_1317452459","MainJS","RayTracer")]staticvoid__Register_(){if(initialized||global::System.Runtime.InteropServices.RuntimeInformation.OSArchitecture!=global::System.Runtime.InteropServices.Architecture.Wasm)return;initialized=true;global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:PrepareToRender",1401412665,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.ArraySegment(global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Byte),global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32,global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32});global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:OnClick",1317452459,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Task()});}}

@pavelsavara

Copy link
Copy Markdown
Member

Let's rename __Net7SelfInit_ to something like __DontTrimRegister_. Also please update description on top of this PR.

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 9b8c760 to 77f918bCompareApril 4, 2024 14:45
@pavelsavara

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime.
I think it's OK. @lewing thoughts ?

@maraf

maraf commented Apr 5, 2024

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime. I think it's OK. @lewing thoughts ?

.NET 7 is EOL on May 14, 2024. Removing support seems reasonable to me

@pavelsavarapavelsavara added the os-browser Browser variant of arch-wasm label Apr 5, 2024
@kg
kg merged commit 0c92024 into dotnet:mainApr 5, 2024
@radekdoulik

Copy link
Copy Markdown
Member
image works nicely

matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
…exports (dotnet#99924)
Change generated JSImport/JSExport initializer to not rely on Environment.Version, for faster startup
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 12, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-System.Runtime.InteropServices.JavaScriptlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports - #99924

Merged
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1
Apr 5, 2024
Merged

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports#99924
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1

Conversation

@kg

@kgkg commented Mar 18, 2024

Copy link
Copy Markdown
Contributor

Generated JSImport/JSExport initializer does an Environment.Version check to see if we're on NET7. That check is tremendously expensive, because it fetches a CustomAttribute instance off of something in corlib, then parses the version string (parsing version strings initializes a bunch of stuff). This PR removes that check and adds a linker dependency to keep the registration method alive so it can be called when needed.

We will also need to document that DLLs (in nugets?) generated by this new version of the generator won't work on NET7 runtimes, since the relevant logic to perform automatic registration on that version.

@kgkg added the arch-wasm WebAssembly architecture label Mar 18, 2024
@kgkg added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Mar 18, 2024
@kg
kg marked this pull request as ready for review March 18, 2024 23:41
@kg

kg commented Mar 18, 2024

Copy link
Copy Markdown
ContributorAuthor

Requesting review to get feedback. I hope someone knows trimming better than me and can suggest how to fix this. Put a dependency attribute of some kind on the generated module initializer, maybe?

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 64759a1 to 8a4b7fcCompareApril 3, 2024 19:36
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Apr 3, 2024
@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 8a4b7fc to 96666c5CompareApril 3, 2024 19:42
@kgkg removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Apr 3, 2024
@kg
kg requested a review from pavelsavaraApril 3, 2024 20:58
@pavelsavara

Copy link
Copy Markdown
Member

Could you please show the generated code ?

@kg

kg commented Apr 3, 2024

Copy link
Copy Markdown
ContributorAuthor

Could you please show the generated code ?

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]unsafeclass__GeneratedInitializer{[global::System.ThreadStaticAttribute]staticboolinitialized;[global::System.Runtime.CompilerServices.ModuleInitializerAttribute,global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods|global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods,typeof(__GeneratedInitializer))]staticinternalvoid__Net7SelfInit_(){}[global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_PrepareToRender_1401412665","MainJS","RayTracer")][global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_OnClick_1317452459","MainJS","RayTracer")]staticvoid__Register_(){if(initialized||global::System.Runtime.InteropServices.RuntimeInformation.OSArchitecture!=global::System.Runtime.InteropServices.Architecture.Wasm)return;initialized=true;global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:PrepareToRender",1401412665,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.ArraySegment(global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Byte),global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32,global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32});global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:OnClick",1317452459,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Task()});}}

@pavelsavara

Copy link
Copy Markdown
Member

Let's rename __Net7SelfInit_ to something like __DontTrimRegister_. Also please update description on top of this PR.

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 9b8c760 to 77f918bCompareApril 4, 2024 14:45
@pavelsavara

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime.
I think it's OK. @lewing thoughts ?

@maraf

maraf commented Apr 5, 2024

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime. I think it's OK. @lewing thoughts ?

.NET 7 is EOL on May 14, 2024. Removing support seems reasonable to me

@pavelsavarapavelsavara added the os-browser Browser variant of arch-wasm label Apr 5, 2024
@kg
kg merged commit 0c92024 into dotnet:mainApr 5, 2024
@radekdoulik

Copy link
Copy Markdown
Member
image works nicely

matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
…exports (dotnet#99924)
Change generated JSImport/JSExport initializer to not rely on Environment.Version, for faster startup
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 12, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-System.Runtime.InteropServices.JavaScriptlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports - #99924

Merged
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1
Apr 5, 2024
Merged

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports#99924
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1

Conversation

@kg

@kgkg commented Mar 18, 2024

Copy link
Copy Markdown
Contributor

Generated JSImport/JSExport initializer does an Environment.Version check to see if we're on NET7. That check is tremendously expensive, because it fetches a CustomAttribute instance off of something in corlib, then parses the version string (parsing version strings initializes a bunch of stuff). This PR removes that check and adds a linker dependency to keep the registration method alive so it can be called when needed.

We will also need to document that DLLs (in nugets?) generated by this new version of the generator won't work on NET7 runtimes, since the relevant logic to perform automatic registration on that version.

@kgkg added the arch-wasm WebAssembly architecture label Mar 18, 2024
@kgkg added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Mar 18, 2024
@kg
kg marked this pull request as ready for review March 18, 2024 23:41
@kg

kg commented Mar 18, 2024

Copy link
Copy Markdown
ContributorAuthor

Requesting review to get feedback. I hope someone knows trimming better than me and can suggest how to fix this. Put a dependency attribute of some kind on the generated module initializer, maybe?

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 64759a1 to 8a4b7fcCompareApril 3, 2024 19:36
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Apr 3, 2024
@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 8a4b7fc to 96666c5CompareApril 3, 2024 19:42
@kgkg removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Apr 3, 2024
@kg
kg requested a review from pavelsavaraApril 3, 2024 20:58
@pavelsavara

Copy link
Copy Markdown
Member

Could you please show the generated code ?

@kg

kg commented Apr 3, 2024

Copy link
Copy Markdown
ContributorAuthor

Could you please show the generated code ?

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]unsafeclass__GeneratedInitializer{[global::System.ThreadStaticAttribute]staticboolinitialized;[global::System.Runtime.CompilerServices.ModuleInitializerAttribute,global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods|global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods,typeof(__GeneratedInitializer))]staticinternalvoid__Net7SelfInit_(){}[global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_PrepareToRender_1401412665","MainJS","RayTracer")][global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_OnClick_1317452459","MainJS","RayTracer")]staticvoid__Register_(){if(initialized||global::System.Runtime.InteropServices.RuntimeInformation.OSArchitecture!=global::System.Runtime.InteropServices.Architecture.Wasm)return;initialized=true;global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:PrepareToRender",1401412665,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.ArraySegment(global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Byte),global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32,global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32});global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:OnClick",1317452459,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Task()});}}

@pavelsavara

Copy link
Copy Markdown
Member

Let's rename __Net7SelfInit_ to something like __DontTrimRegister_. Also please update description on top of this PR.

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 9b8c760 to 77f918bCompareApril 4, 2024 14:45
@pavelsavara

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime.
I think it's OK. @lewing thoughts ?

@maraf

maraf commented Apr 5, 2024

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime. I think it's OK. @lewing thoughts ?

.NET 7 is EOL on May 14, 2024. Removing support seems reasonable to me

@pavelsavarapavelsavara added the os-browser Browser variant of arch-wasm label Apr 5, 2024
@kg
kg merged commit 0c92024 into dotnet:mainApr 5, 2024
@radekdoulik

Copy link
Copy Markdown
Member
image works nicely

matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
…exports (dotnet#99924)
Change generated JSImport/JSExport initializer to not rely on Environment.Version, for faster startup
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 12, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-System.Runtime.InteropServices.JavaScriptlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

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

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports - #99924

Merged
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1
Apr 5, 2024
Merged

[wasm] Improvements to startup performance of mono_wasm_get_assembly_exports#99924
kg merged 4 commits into
dotnet:mainfrom
kg:wasm-assemblyexports-opt-1

Conversation

@kg

@kgkg commented Mar 18, 2024

Copy link
Copy Markdown
Contributor

Generated JSImport/JSExport initializer does an Environment.Version check to see if we're on NET7. That check is tremendously expensive, because it fetches a CustomAttribute instance off of something in corlib, then parses the version string (parsing version strings initializes a bunch of stuff). This PR removes that check and adds a linker dependency to keep the registration method alive so it can be called when needed.

We will also need to document that DLLs (in nugets?) generated by this new version of the generator won't work on NET7 runtimes, since the relevant logic to perform automatic registration on that version.

@kgkg added the arch-wasm WebAssembly architecture label Mar 18, 2024
@kgkg added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Mar 18, 2024
@kg
kg marked this pull request as ready for review March 18, 2024 23:41
@kg

kg commented Mar 18, 2024

Copy link
Copy Markdown
ContributorAuthor

Requesting review to get feedback. I hope someone knows trimming better than me and can suggest how to fix this. Put a dependency attribute of some kind on the generated module initializer, maybe?

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 64759a1 to 8a4b7fcCompareApril 3, 2024 19:36
@dotnet-policy-servicedotnet-policy-serviceBot added the linkable-framework Issues associated with delivering a linker friendly framework label Apr 3, 2024
@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 8a4b7fc to 96666c5CompareApril 3, 2024 19:42
@kgkg removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Apr 3, 2024
@kg
kg requested a review from pavelsavaraApril 3, 2024 20:58
@pavelsavara

Copy link
Copy Markdown
Member

Could you please show the generated code ?

@kg

kg commented Apr 3, 2024

Copy link
Copy Markdown
ContributorAuthor

Could you please show the generated code ?

[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute]unsafeclass__GeneratedInitializer{[global::System.ThreadStaticAttribute]staticboolinitialized;[global::System.Runtime.CompilerServices.ModuleInitializerAttribute,global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods|global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods,typeof(__GeneratedInitializer))]staticinternalvoid__Net7SelfInit_(){}[global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_PrepareToRender_1401412665","MainJS","RayTracer")][global::System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute("__Wrapper_OnClick_1317452459","MainJS","RayTracer")]staticvoid__Register_(){if(initialized||global::System.Runtime.InteropServices.RuntimeInformation.OSArchitecture!=global::System.Runtime.InteropServices.Architecture.Wasm)return;initialized=true;global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:PrepareToRender",1401412665,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.ArraySegment(global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Byte),global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32,global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Int32});global::System.Runtime.InteropServices.JavaScript.JSFunctionBinding.BindManagedFunction("[RayTracer]MainJS:OnClick",1317452459,newglobal::System.Runtime.InteropServices.JavaScript.JSMarshalerType[]{global::System.Runtime.InteropServices.JavaScript.JSMarshalerType.Task()});}}

@pavelsavara

Copy link
Copy Markdown
Member

Let's rename __Net7SelfInit_ to something like __DontTrimRegister_. Also please update description on top of this PR.

@kg
kgforce-pushed the wasm-assemblyexports-opt-1 branch from 9b8c760 to 77f918bCompareApril 4, 2024 14:45
@pavelsavara

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime.
I think it's OK. @lewing thoughts ?

@maraf

maraf commented Apr 5, 2024

Copy link
Copy Markdown
Member

Here we are removing support for 3rd party library/nuget generated by Net9 SDK from being able to run on Net7 runtime. I think it's OK. @lewing thoughts ?

.NET 7 is EOL on May 14, 2024. Removing support seems reasonable to me

@pavelsavarapavelsavara added the os-browser Browser variant of arch-wasm label Apr 5, 2024
@kg
kg merged commit 0c92024 into dotnet:mainApr 5, 2024
@radekdoulik

Copy link
Copy Markdown
Member
image works nicely

matouskozak pushed a commit to matouskozak/runtime that referenced this pull request Apr 30, 2024
…exports (dotnet#99924)
Change generated JSImport/JSExport initializer to not rely on Environment.Version, for faster startup
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 12, 2024
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-System.Runtime.InteropServices.JavaScriptlinkable-frameworkIssues associated with delivering a linker friendly frameworkos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@kg@pavelsavara@maraf@radekdoulik