Skip to content

NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance #91186

Description

@Jakimar

Description

I was checking new behavior for "ActivatorUtilities.CreateInstance" in NET 8.0 and noticed some perfomance regression when invoked for class with not empty construcor, as i can see something changed between "Preview 6" and "Preview 7", it's slighly better in last daily build "rc.2.23426.4" but still much worse than NET7.0 .

public class Tester
{
private static IServiceProvider _spProvider;
public Tester()
{
var sc = new ServiceCollection();
sc.AddScoped<A>();
sc.AddScoped<B>();
sc.AddScoped<C>();
_spProvider = sc.BuildServiceProvider();
}
public A? CreateA()
{
var scope = _spProvider.CreateScope();
return ActivatorUtilities.CreateInstance<A>(scope.ServiceProvider);
}
public B? CreateB()
{
var scope = _spProvider.CreateScope();
return ActivatorUtilities.CreateInstance<B>(scope.ServiceProvider);
}
public C? CreateC()
{
var scope = _spProvider.CreateScope();
return ActivatorUtilities.CreateInstance<C>(scope.ServiceProvider);
}
}
public class A
{ }
public class B
{
private readonly A _a;
public B(A a)
{
_a = a;
}
}
public class C
{
private readonly B _b;
private readonly B _b1;
private readonly B _b2;
private readonly B _b3;
private readonly B _b4;
private readonly B _b5;
public C(B b, B b1, B b2, B b3, B b4, B b5)
{
_b = b;
_b1 = b1;
_b2 = b2;
_b3 = b3;
_b4 = b4;
_b5 = b5;
}
}

Configuration

BenchmarkDotNet v0.13.7, Windows 10 (10.0.19044.3086/21H2/November2021Update)
11th Gen Intel Core i5-11600K 3.90GHz, 1 CPU, 12 logical and 6 physical cores
.NET SDK 8.0.100-rc.2.23425.18
[Host] : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
7.0.0 : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
8.0.0-preview.6.23329.7 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
8.0.0-preview.7.23375.6 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
8.0.0-rc.2.23426.4 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2

Regression?

Data

MethodRuntimeNuGetReferencesMeanErrorStdDevRatio
CreateA.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0122.1 ns2.05 ns1.92 nsbaseline
CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7116.8 ns2.33 ns2.50 ns-4%
CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6113.6 ns1.54 ns1.44 ns-7%
CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4119.0 ns2.42 ns2.69 ns-3%
CreateB.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0220.3 ns3.31 ns3.10 nsbaseline
CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7218.9 ns3.83 ns3.39 ns-1%
CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6480.0 ns3.31 ns2.76 ns+118%
CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4402.6 ns4.53 ns4.24 ns+83%
CreateC.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0522.9 ns4.21 ns3.73 nsbaseline
CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7494.1 ns3.49 ns2.91 ns-5%
CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.62,489.0 ns26.57 ns24.85 ns+376%
CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.41,604.6 ns26.34 ns23.35 ns+207%

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , '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" + '
    NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance · Issue #91186 · dotnet/runtime · GitHub
    Skip to content

    NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance #91186

    Description

    @Jakimar

    Description

    I was checking new behavior for "ActivatorUtilities.CreateInstance" in NET 8.0 and noticed some perfomance regression when invoked for class with not empty construcor, as i can see something changed between "Preview 6" and "Preview 7", it's slighly better in last daily build "rc.2.23426.4" but still much worse than NET7.0 .

    public class Tester
    {
    private static IServiceProvider _spProvider;
    public Tester()
    {
    var sc = new ServiceCollection();
    sc.AddScoped<A>();
    sc.AddScoped<B>();
    sc.AddScoped<C>();
    _spProvider = sc.BuildServiceProvider();
    }
    public A? CreateA()
    {
    var scope = _spProvider.CreateScope();
    return ActivatorUtilities.CreateInstance<A>(scope.ServiceProvider);
    }
    public B? CreateB()
    {
    var scope = _spProvider.CreateScope();
    return ActivatorUtilities.CreateInstance<B>(scope.ServiceProvider);
    }
    public C? CreateC()
    {
    var scope = _spProvider.CreateScope();
    return ActivatorUtilities.CreateInstance<C>(scope.ServiceProvider);
    }
    }
    public class A
    { }
    public class B
    {
    private readonly A _a;
    public B(A a)
    {
    _a = a;
    }
    }
    public class C
    {
    private readonly B _b;
    private readonly B _b1;
    private readonly B _b2;
    private readonly B _b3;
    private readonly B _b4;
    private readonly B _b5;
    public C(B b, B b1, B b2, B b3, B b4, B b5)
    {
    _b = b;
    _b1 = b1;
    _b2 = b2;
    _b3 = b3;
    _b4 = b4;
    _b5 = b5;
    }
    }
    

    Configuration

    BenchmarkDotNet v0.13.7, Windows 10 (10.0.19044.3086/21H2/November2021Update)
    11th Gen Intel Core i5-11600K 3.90GHz, 1 CPU, 12 logical and 6 physical cores
    .NET SDK 8.0.100-rc.2.23425.18
    [Host] : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
    7.0.0 : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
    8.0.0-preview.6.23329.7 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
    8.0.0-preview.7.23375.6 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
    8.0.0-rc.2.23426.4 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
    

    Regression?

    Data

    MethodRuntimeNuGetReferencesMeanErrorStdDevRatio
    CreateA.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0122.1 ns2.05 ns1.92 nsbaseline
    CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7116.8 ns2.33 ns2.50 ns-4%
    CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6113.6 ns1.54 ns1.44 ns-7%
    CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4119.0 ns2.42 ns2.69 ns-3%
    CreateB.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0220.3 ns3.31 ns3.10 nsbaseline
    CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7218.9 ns3.83 ns3.39 ns-1%
    CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6480.0 ns3.31 ns2.76 ns+118%
    CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4402.6 ns4.53 ns4.24 ns+83%
    CreateC.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0522.9 ns4.21 ns3.73 nsbaseline
    CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7494.1 ns3.49 ns2.91 ns-5%
    CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.62,489.0 ns26.57 ns24.85 ns+376%
    CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.41,604.6 ns26.34 ns23.35 ns+207%

    Metadata

    Metadata

    Assignees

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , '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('^' + ".*" + ' NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance · Issue #91186 · dotnet/runtime · GitHub
      Skip to content

      NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance #91186

      Description

      @Jakimar

      Description

      I was checking new behavior for "ActivatorUtilities.CreateInstance" in NET 8.0 and noticed some perfomance regression when invoked for class with not empty construcor, as i can see something changed between "Preview 6" and "Preview 7", it's slighly better in last daily build "rc.2.23426.4" but still much worse than NET7.0 .

      public class Tester
      {
      private static IServiceProvider _spProvider;
      public Tester()
      {
      var sc = new ServiceCollection();
      sc.AddScoped<A>();
      sc.AddScoped<B>();
      sc.AddScoped<C>();
      _spProvider = sc.BuildServiceProvider();
      }
      public A? CreateA()
      {
      var scope = _spProvider.CreateScope();
      return ActivatorUtilities.CreateInstance<A>(scope.ServiceProvider);
      }
      public B? CreateB()
      {
      var scope = _spProvider.CreateScope();
      return ActivatorUtilities.CreateInstance<B>(scope.ServiceProvider);
      }
      public C? CreateC()
      {
      var scope = _spProvider.CreateScope();
      return ActivatorUtilities.CreateInstance<C>(scope.ServiceProvider);
      }
      }
      public class A
      { }
      public class B
      {
      private readonly A _a;
      public B(A a)
      {
      _a = a;
      }
      }
      public class C
      {
      private readonly B _b;
      private readonly B _b1;
      private readonly B _b2;
      private readonly B _b3;
      private readonly B _b4;
      private readonly B _b5;
      public C(B b, B b1, B b2, B b3, B b4, B b5)
      {
      _b = b;
      _b1 = b1;
      _b2 = b2;
      _b3 = b3;
      _b4 = b4;
      _b5 = b5;
      }
      }
      

      Configuration

      BenchmarkDotNet v0.13.7, Windows 10 (10.0.19044.3086/21H2/November2021Update)
      11th Gen Intel Core i5-11600K 3.90GHz, 1 CPU, 12 logical and 6 physical cores
      .NET SDK 8.0.100-rc.2.23425.18
      [Host] : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
      7.0.0 : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
      8.0.0-preview.6.23329.7 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
      8.0.0-preview.7.23375.6 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
      8.0.0-rc.2.23426.4 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
      

      Regression?

      Data

      MethodRuntimeNuGetReferencesMeanErrorStdDevRatio
      CreateA.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0122.1 ns2.05 ns1.92 nsbaseline
      CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7116.8 ns2.33 ns2.50 ns-4%
      CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6113.6 ns1.54 ns1.44 ns-7%
      CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4119.0 ns2.42 ns2.69 ns-3%
      CreateB.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0220.3 ns3.31 ns3.10 nsbaseline
      CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7218.9 ns3.83 ns3.39 ns-1%
      CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6480.0 ns3.31 ns2.76 ns+118%
      CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4402.6 ns4.53 ns4.24 ns+83%
      CreateC.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0522.9 ns4.21 ns3.73 nsbaseline
      CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7494.1 ns3.49 ns2.91 ns-5%
      CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.62,489.0 ns26.57 ns24.85 ns+376%
      CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.41,604.6 ns26.34 ns23.35 ns+207%

      Metadata

      Metadata

      Assignees

      Type

      No type

      Projects

      No projects

        Milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , '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('^' + ".*" + ' NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance · Issue #91186 · dotnet/runtime · GitHub
        Skip to content

        NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance #91186

        Description

        @Jakimar

        Description

        I was checking new behavior for "ActivatorUtilities.CreateInstance" in NET 8.0 and noticed some perfomance regression when invoked for class with not empty construcor, as i can see something changed between "Preview 6" and "Preview 7", it's slighly better in last daily build "rc.2.23426.4" but still much worse than NET7.0 .

        public class Tester
        {
        private static IServiceProvider _spProvider;
        public Tester()
        {
        var sc = new ServiceCollection();
        sc.AddScoped<A>();
        sc.AddScoped<B>();
        sc.AddScoped<C>();
        _spProvider = sc.BuildServiceProvider();
        }
        public A? CreateA()
        {
        var scope = _spProvider.CreateScope();
        return ActivatorUtilities.CreateInstance<A>(scope.ServiceProvider);
        }
        public B? CreateB()
        {
        var scope = _spProvider.CreateScope();
        return ActivatorUtilities.CreateInstance<B>(scope.ServiceProvider);
        }
        public C? CreateC()
        {
        var scope = _spProvider.CreateScope();
        return ActivatorUtilities.CreateInstance<C>(scope.ServiceProvider);
        }
        }
        public class A
        { }
        public class B
        {
        private readonly A _a;
        public B(A a)
        {
        _a = a;
        }
        }
        public class C
        {
        private readonly B _b;
        private readonly B _b1;
        private readonly B _b2;
        private readonly B _b3;
        private readonly B _b4;
        private readonly B _b5;
        public C(B b, B b1, B b2, B b3, B b4, B b5)
        {
        _b = b;
        _b1 = b1;
        _b2 = b2;
        _b3 = b3;
        _b4 = b4;
        _b5 = b5;
        }
        }
        

        Configuration

        BenchmarkDotNet v0.13.7, Windows 10 (10.0.19044.3086/21H2/November2021Update)
        11th Gen Intel Core i5-11600K 3.90GHz, 1 CPU, 12 logical and 6 physical cores
        .NET SDK 8.0.100-rc.2.23425.18
        [Host] : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
        7.0.0 : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
        8.0.0-preview.6.23329.7 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
        8.0.0-preview.7.23375.6 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
        8.0.0-rc.2.23426.4 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
        

        Regression?

        Data

        MethodRuntimeNuGetReferencesMeanErrorStdDevRatio
        CreateA.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0122.1 ns2.05 ns1.92 nsbaseline
        CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7116.8 ns2.33 ns2.50 ns-4%
        CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6113.6 ns1.54 ns1.44 ns-7%
        CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4119.0 ns2.42 ns2.69 ns-3%
        CreateB.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0220.3 ns3.31 ns3.10 nsbaseline
        CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7218.9 ns3.83 ns3.39 ns-1%
        CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6480.0 ns3.31 ns2.76 ns+118%
        CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4402.6 ns4.53 ns4.24 ns+83%
        CreateC.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0522.9 ns4.21 ns3.73 nsbaseline
        CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7494.1 ns3.49 ns2.91 ns-5%
        CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.62,489.0 ns26.57 ns24.85 ns+376%
        CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.41,604.6 ns26.34 ns23.35 ns+207%

        Metadata

        Metadata

        Assignees

        Type

        No type

        Projects

        No projects

          Milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , '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" + ' NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance · Issue #91186 · dotnet/runtime · GitHub
          Skip to content

          NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance #91186

          Description

          @Jakimar

          Description

          I was checking new behavior for "ActivatorUtilities.CreateInstance" in NET 8.0 and noticed some perfomance regression when invoked for class with not empty construcor, as i can see something changed between "Preview 6" and "Preview 7", it's slighly better in last daily build "rc.2.23426.4" but still much worse than NET7.0 .

          public class Tester
          {
          private static IServiceProvider _spProvider;
          public Tester()
          {
          var sc = new ServiceCollection();
          sc.AddScoped<A>();
          sc.AddScoped<B>();
          sc.AddScoped<C>();
          _spProvider = sc.BuildServiceProvider();
          }
          public A? CreateA()
          {
          var scope = _spProvider.CreateScope();
          return ActivatorUtilities.CreateInstance<A>(scope.ServiceProvider);
          }
          public B? CreateB()
          {
          var scope = _spProvider.CreateScope();
          return ActivatorUtilities.CreateInstance<B>(scope.ServiceProvider);
          }
          public C? CreateC()
          {
          var scope = _spProvider.CreateScope();
          return ActivatorUtilities.CreateInstance<C>(scope.ServiceProvider);
          }
          }
          public class A
          { }
          public class B
          {
          private readonly A _a;
          public B(A a)
          {
          _a = a;
          }
          }
          public class C
          {
          private readonly B _b;
          private readonly B _b1;
          private readonly B _b2;
          private readonly B _b3;
          private readonly B _b4;
          private readonly B _b5;
          public C(B b, B b1, B b2, B b3, B b4, B b5)
          {
          _b = b;
          _b1 = b1;
          _b2 = b2;
          _b3 = b3;
          _b4 = b4;
          _b5 = b5;
          }
          }
          

          Configuration

          BenchmarkDotNet v0.13.7, Windows 10 (10.0.19044.3086/21H2/November2021Update)
          11th Gen Intel Core i5-11600K 3.90GHz, 1 CPU, 12 logical and 6 physical cores
          .NET SDK 8.0.100-rc.2.23425.18
          [Host] : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
          7.0.0 : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
          8.0.0-preview.6.23329.7 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
          8.0.0-preview.7.23375.6 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
          8.0.0-rc.2.23426.4 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
          

          Regression?

          Data

          MethodRuntimeNuGetReferencesMeanErrorStdDevRatio
          CreateA.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0122.1 ns2.05 ns1.92 nsbaseline
          CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7116.8 ns2.33 ns2.50 ns-4%
          CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6113.6 ns1.54 ns1.44 ns-7%
          CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4119.0 ns2.42 ns2.69 ns-3%
          CreateB.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0220.3 ns3.31 ns3.10 nsbaseline
          CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7218.9 ns3.83 ns3.39 ns-1%
          CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6480.0 ns3.31 ns2.76 ns+118%
          CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4402.6 ns4.53 ns4.24 ns+83%
          CreateC.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0522.9 ns4.21 ns3.73 nsbaseline
          CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7494.1 ns3.49 ns2.91 ns-5%
          CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.62,489.0 ns26.57 ns24.85 ns+376%
          CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.41,604.6 ns26.34 ns23.35 ns+207%

          Metadata

          Metadata

          Assignees

          Type

          No type

          Projects

          No projects

            Milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , '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('^' + ".*" + ' NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance · Issue #91186 · dotnet/runtime · GitHub
            Skip to content

            NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance #91186

            Description

            @Jakimar

            Description

            I was checking new behavior for "ActivatorUtilities.CreateInstance" in NET 8.0 and noticed some perfomance regression when invoked for class with not empty construcor, as i can see something changed between "Preview 6" and "Preview 7", it's slighly better in last daily build "rc.2.23426.4" but still much worse than NET7.0 .

            public class Tester
            {
            private static IServiceProvider _spProvider;
            public Tester()
            {
            var sc = new ServiceCollection();
            sc.AddScoped<A>();
            sc.AddScoped<B>();
            sc.AddScoped<C>();
            _spProvider = sc.BuildServiceProvider();
            }
            public A? CreateA()
            {
            var scope = _spProvider.CreateScope();
            return ActivatorUtilities.CreateInstance<A>(scope.ServiceProvider);
            }
            public B? CreateB()
            {
            var scope = _spProvider.CreateScope();
            return ActivatorUtilities.CreateInstance<B>(scope.ServiceProvider);
            }
            public C? CreateC()
            {
            var scope = _spProvider.CreateScope();
            return ActivatorUtilities.CreateInstance<C>(scope.ServiceProvider);
            }
            }
            public class A
            { }
            public class B
            {
            private readonly A _a;
            public B(A a)
            {
            _a = a;
            }
            }
            public class C
            {
            private readonly B _b;
            private readonly B _b1;
            private readonly B _b2;
            private readonly B _b3;
            private readonly B _b4;
            private readonly B _b5;
            public C(B b, B b1, B b2, B b3, B b4, B b5)
            {
            _b = b;
            _b1 = b1;
            _b2 = b2;
            _b3 = b3;
            _b4 = b4;
            _b5 = b5;
            }
            }
            

            Configuration

            BenchmarkDotNet v0.13.7, Windows 10 (10.0.19044.3086/21H2/November2021Update)
            11th Gen Intel Core i5-11600K 3.90GHz, 1 CPU, 12 logical and 6 physical cores
            .NET SDK 8.0.100-rc.2.23425.18
            [Host] : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
            7.0.0 : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
            8.0.0-preview.6.23329.7 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
            8.0.0-preview.7.23375.6 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
            8.0.0-rc.2.23426.4 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
            

            Regression?

            Data

            MethodRuntimeNuGetReferencesMeanErrorStdDevRatio
            CreateA.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0122.1 ns2.05 ns1.92 nsbaseline
            CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7116.8 ns2.33 ns2.50 ns-4%
            CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6113.6 ns1.54 ns1.44 ns-7%
            CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4119.0 ns2.42 ns2.69 ns-3%
            CreateB.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0220.3 ns3.31 ns3.10 nsbaseline
            CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7218.9 ns3.83 ns3.39 ns-1%
            CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6480.0 ns3.31 ns2.76 ns+118%
            CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4402.6 ns4.53 ns4.24 ns+83%
            CreateC.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0522.9 ns4.21 ns3.73 nsbaseline
            CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7494.1 ns3.49 ns2.91 ns-5%
            CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.62,489.0 ns26.57 ns24.85 ns+376%
            CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.41,604.6 ns26.34 ns23.35 ns+207%

            Metadata

            Metadata

            Assignees

            Type

            No type

            Projects

            No projects

              Milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , '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('^' + ".*" + ' NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance · Issue #91186 · dotnet/runtime · GitHub
              Skip to content

              NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance #91186

              Description

              @Jakimar

              Description

              I was checking new behavior for "ActivatorUtilities.CreateInstance" in NET 8.0 and noticed some perfomance regression when invoked for class with not empty construcor, as i can see something changed between "Preview 6" and "Preview 7", it's slighly better in last daily build "rc.2.23426.4" but still much worse than NET7.0 .

              public class Tester
              {
              private static IServiceProvider _spProvider;
              public Tester()
              {
              var sc = new ServiceCollection();
              sc.AddScoped<A>();
              sc.AddScoped<B>();
              sc.AddScoped<C>();
              _spProvider = sc.BuildServiceProvider();
              }
              public A? CreateA()
              {
              var scope = _spProvider.CreateScope();
              return ActivatorUtilities.CreateInstance<A>(scope.ServiceProvider);
              }
              public B? CreateB()
              {
              var scope = _spProvider.CreateScope();
              return ActivatorUtilities.CreateInstance<B>(scope.ServiceProvider);
              }
              public C? CreateC()
              {
              var scope = _spProvider.CreateScope();
              return ActivatorUtilities.CreateInstance<C>(scope.ServiceProvider);
              }
              }
              public class A
              { }
              public class B
              {
              private readonly A _a;
              public B(A a)
              {
              _a = a;
              }
              }
              public class C
              {
              private readonly B _b;
              private readonly B _b1;
              private readonly B _b2;
              private readonly B _b3;
              private readonly B _b4;
              private readonly B _b5;
              public C(B b, B b1, B b2, B b3, B b4, B b5)
              {
              _b = b;
              _b1 = b1;
              _b2 = b2;
              _b3 = b3;
              _b4 = b4;
              _b5 = b5;
              }
              }
              

              Configuration

              BenchmarkDotNet v0.13.7, Windows 10 (10.0.19044.3086/21H2/November2021Update)
              11th Gen Intel Core i5-11600K 3.90GHz, 1 CPU, 12 logical and 6 physical cores
              .NET SDK 8.0.100-rc.2.23425.18
              [Host] : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
              7.0.0 : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
              8.0.0-preview.6.23329.7 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
              8.0.0-preview.7.23375.6 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
              8.0.0-rc.2.23426.4 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
              

              Regression?

              Data

              MethodRuntimeNuGetReferencesMeanErrorStdDevRatio
              CreateA.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0122.1 ns2.05 ns1.92 nsbaseline
              CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7116.8 ns2.33 ns2.50 ns-4%
              CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6113.6 ns1.54 ns1.44 ns-7%
              CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4119.0 ns2.42 ns2.69 ns-3%
              CreateB.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0220.3 ns3.31 ns3.10 nsbaseline
              CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7218.9 ns3.83 ns3.39 ns-1%
              CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6480.0 ns3.31 ns2.76 ns+118%
              CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4402.6 ns4.53 ns4.24 ns+83%
              CreateC.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0522.9 ns4.21 ns3.73 nsbaseline
              CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7494.1 ns3.49 ns2.91 ns-5%
              CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.62,489.0 ns26.57 ns24.85 ns+376%
              CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.41,604.6 ns26.34 ns23.35 ns+207%

              Metadata

              Metadata

              Assignees

              Type

              No type

              Projects

              No projects

                Milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , '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); } })(); })(); NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance · Issue #91186 · dotnet/runtime · GitHub
                Skip to content

                NET 8.0 Preview 7 Performance Regression: ActivatorUtilities.CreateInstance #91186

                Description

                @Jakimar

                Description

                I was checking new behavior for "ActivatorUtilities.CreateInstance" in NET 8.0 and noticed some perfomance regression when invoked for class with not empty construcor, as i can see something changed between "Preview 6" and "Preview 7", it's slighly better in last daily build "rc.2.23426.4" but still much worse than NET7.0 .

                public class Tester
                {
                private static IServiceProvider _spProvider;
                public Tester()
                {
                var sc = new ServiceCollection();
                sc.AddScoped<A>();
                sc.AddScoped<B>();
                sc.AddScoped<C>();
                _spProvider = sc.BuildServiceProvider();
                }
                public A? CreateA()
                {
                var scope = _spProvider.CreateScope();
                return ActivatorUtilities.CreateInstance<A>(scope.ServiceProvider);
                }
                public B? CreateB()
                {
                var scope = _spProvider.CreateScope();
                return ActivatorUtilities.CreateInstance<B>(scope.ServiceProvider);
                }
                public C? CreateC()
                {
                var scope = _spProvider.CreateScope();
                return ActivatorUtilities.CreateInstance<C>(scope.ServiceProvider);
                }
                }
                public class A
                { }
                public class B
                {
                private readonly A _a;
                public B(A a)
                {
                _a = a;
                }
                }
                public class C
                {
                private readonly B _b;
                private readonly B _b1;
                private readonly B _b2;
                private readonly B _b3;
                private readonly B _b4;
                private readonly B _b5;
                public C(B b, B b1, B b2, B b3, B b4, B b5)
                {
                _b = b;
                _b1 = b1;
                _b2 = b2;
                _b3 = b3;
                _b4 = b4;
                _b5 = b5;
                }
                }
                

                Configuration

                BenchmarkDotNet v0.13.7, Windows 10 (10.0.19044.3086/21H2/November2021Update)
                11th Gen Intel Core i5-11600K 3.90GHz, 1 CPU, 12 logical and 6 physical cores
                .NET SDK 8.0.100-rc.2.23425.18
                [Host] : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
                7.0.0 : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
                8.0.0-preview.6.23329.7 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
                8.0.0-preview.7.23375.6 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
                8.0.0-rc.2.23426.4 : .NET 8.0.0 (8.0.23.42311), X64 RyuJIT AVX2
                

                Regression?

                Data

                MethodRuntimeNuGetReferencesMeanErrorStdDevRatio
                CreateA.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0122.1 ns2.05 ns1.92 nsbaseline
                CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7116.8 ns2.33 ns2.50 ns-4%
                CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6113.6 ns1.54 ns1.44 ns-7%
                CreateA.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4119.0 ns2.42 ns2.69 ns-3%
                CreateB.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0220.3 ns3.31 ns3.10 nsbaseline
                CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7218.9 ns3.83 ns3.39 ns-1%
                CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.6480.0 ns3.31 ns2.76 ns+118%
                CreateB.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.4402.6 ns4.53 ns4.24 ns+83%
                CreateC.NET 7.0Microsoft.Extensions.DependencyInjection 7.0.0522.9 ns4.21 ns3.73 nsbaseline
                CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.6.23329.7494.1 ns3.49 ns2.91 ns-5%
                CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-preview.7.23375.62,489.0 ns26.57 ns24.85 ns+376%
                CreateC.NET 8.0Microsoft.Extensions.DependencyInjection 8.0.0-rc.2.23426.41,604.6 ns26.34 ns23.35 ns+207%

                Metadata

                Metadata

                Assignees

                Type

                No type

                Projects

                No projects

                  Milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions