<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Volatile Delegate</title>
    <description>The latest articles on DEV Community by Volatile Delegate (@netdefender).</description>
    <link>https://dev.to/netdefender</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1167988%2Fd4b7a1e8-dd7b-406b-b503-f3604c4951f1.png</url>
      <title>DEV Community: Volatile Delegate</title>
      <link>https://dev.to/netdefender</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/netdefender"/>
    <language>en</language>
    <item>
      <title>Interface Proxy</title>
      <dc:creator>Volatile Delegate</dc:creator>
      <pubDate>Wed, 11 Oct 2023 21:25:41 +0000</pubDate>
      <link>https://dev.to/netdefender/interface-proxy-5djm</link>
      <guid>https://dev.to/netdefender/interface-proxy-5djm</guid>
      <description>&lt;h2&gt;
  
  
  Terminology
&lt;/h2&gt;

&lt;p&gt;&lt;u&gt;NET&lt;/u&gt;: net core 6.0+&lt;br&gt;
&lt;u&gt;NETFRAMEWORK&lt;/u&gt;: classic or legacy .NetFramework&lt;/p&gt;
&lt;h2&gt;
  
  
  History 📚
&lt;/h2&gt;

&lt;p&gt;A technology called Remoting was once in fashion. This technology was built as an alternative to &lt;u&gt;DCOM&lt;/u&gt;.&lt;/p&gt;

&lt;p&gt;It was available for &lt;u&gt;NETFRAMEWORK&lt;/u&gt;.&lt;/p&gt;

&lt;p&gt;It provided classes and interfaces that allowed developers to create and configure distributed applications.&lt;/p&gt;

&lt;p&gt;These classes and interfaces lived in the namespace  &lt;a href="https://learn.microsoft.com/en-us/dotnet/api/system.runtime.remoting?view=netframework-4.8.1" rel="noopener noreferrer"&gt;System.Runtime.Remoting&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The developer requested an instance of a remote service and the remoting infrastructure returned a proxy (a Transparent Proxy).&lt;/p&gt;

&lt;p&gt;Depending on the activation mode, each call to this proxy service was handled in the server by a new instance or by the same instance. This was also related to the life cycle of the instances on the remoting server.&lt;/p&gt;

&lt;p&gt;This can be seen summarized in the &lt;u&gt;WellKnownObjectMode &lt;/u&gt;enumeration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;WellKnownObjectMode&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//Every call is serviced by the same instance&lt;/span&gt;
    &lt;span class="n"&gt;Singleton&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;//Every call is serviced by a new instance.&lt;/span&gt;
    &lt;span class="n"&gt;SingleCall&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Problems 😰
&lt;/h1&gt;

&lt;p&gt;With the arrival of &lt;u&gt;NET&lt;/u&gt;, Microsoft abandoned this technology.&lt;/p&gt;

&lt;p&gt;How could we migrate this technology to &lt;u&gt;NET&lt;/u&gt; in a Windows Forms Application with a SingleCall Remoting implementation?&lt;/p&gt;

&lt;p&gt;Microsoft offered several alternatives, for example &lt;u&gt;streamjsonrpc&lt;/u&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/microsoft" rel="noopener noreferrer"&gt;
        microsoft
      &lt;/a&gt; / &lt;a href="https://github.com/microsoft/vs-streamjsonrpc" rel="noopener noreferrer"&gt;
        vs-streamjsonrpc
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The StreamJsonRpc library offers JSON-RPC 2.0 over any .NET Stream, WebSocket, or Pipe. With bonus support for request cancellation, client proxy generation, and more.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;vs-StreamJsonRpc&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://codecov.io/gh/Microsoft/vs-streamjsonrpc" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1a8beb4ebd9bfed4fd2c7d8bb3366580584ae16e4574528b1d889cd038edb742/68747470733a2f2f636f6465636f762e696f2f67682f4d6963726f736f66742f76732d73747265616d6a736f6e7270632f6272616e63682f6d61696e2f67726170682f62616467652e737667" alt="codecov"&gt;&lt;/a&gt;
&lt;a href="https://gitter.im/vs-streamjsonrpc/Lobby?utm_source=badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=pr-badge&amp;amp;utm_content=badge" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c046a1b8e5f96bf5e3972e6836ab84a729417e52a7278452c3947c17d6be03c2/68747470733a2f2f6261646765732e6769747465722e696d2f76732d73747265616d6a736f6e7270632f4c6f6262792e737667" alt="Join the chat at https://gitter.im/vs-streamjsonrpc/Lobby"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;StreamJsonRpc&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a href="https://nuget.org/packages/StreamJsonRpc" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6e5dee68890d47ae65db0af94ec213db8f4ab2c1a9fe505bd95e4b4f63b0449b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f53747265616d4a736f6e5270632e737667" alt="NuGet package"&gt;&lt;/a&gt;
&lt;a href="https://dev.azure.com/azure-public/vside/_build/latest?definitionId=13" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1f6a590ff96037d8c1432f00018ec7a6670dd6342e325a62d0b64b2d3c58356b/68747470733a2f2f6465762e617a7572652e636f6d2f617a7572652d7075626c69632f76736964652f5f617069732f6275696c642f7374617475732f76732d73747265616d6a736f6e727063" alt="Build Status"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;StreamJsonRpc is a cross-platform, .NET portable library that implements the
&lt;a href="http://jsonrpc.org/" rel="nofollow noopener noreferrer"&gt;JSON-RPC&lt;/a&gt; wire protocol.&lt;/p&gt;
&lt;p&gt;It works over &lt;a href="https://docs.microsoft.com/dotnet/api/system.io.stream" rel="nofollow noopener noreferrer"&gt;Stream&lt;/a&gt;, &lt;a href="https://docs.microsoft.com/dotnet/api/system.net.websockets.websocket" rel="nofollow noopener noreferrer"&gt;WebSocket&lt;/a&gt;, or System.IO.Pipelines pipes, independent of the underlying transport.&lt;/p&gt;
&lt;p&gt;Bonus features beyond the JSON-RPC spec include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Request cancellation&lt;/li&gt;
&lt;li&gt;.NET Events as notifications&lt;/li&gt;
&lt;li&gt;Dynamic client proxy generation&lt;/li&gt;
&lt;li&gt;Support for &lt;a href="https://github.com/microsoft/vs-streamjsonrpcdoc/extensibility.md" rel="noopener noreferrer"&gt;compact binary serialization&lt;/a&gt; via MessagePack&lt;/li&gt;
&lt;li&gt;Pluggable architecture for custom message handling and formatting.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Learn about the use cases for JSON-RPC and how to use this library from our &lt;a href="https://github.com/microsoft/vs-streamjsonrpcdoc/index.md" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/microsoft/vs-streamjsonrpc" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;Or &lt;u&gt;gRpc&lt;/u&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/grpc" rel="noopener noreferrer"&gt;
        grpc
      &lt;/a&gt; / &lt;a href="https://github.com/grpc/grpc-dotnet" rel="noopener noreferrer"&gt;
        grpc-dotnet
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      gRPC for .NET
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;gRPC for .NET&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;gRPC is a modern, open source, high-performance remote procedure call (RPC) framework that can run anywhere. gRPC enables client and server applications to communicate transparently, and simplifies the building of connected systems.&lt;/p&gt;
&lt;p&gt;gRPC functionality for .NET Core 3.0 or later includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.nuget.org/packages/Grpc.AspNetCore" rel="nofollow noopener noreferrer"&gt;Grpc.AspNetCore&lt;/a&gt; – An ASP.NET Core framework for hosting gRPC services. gRPC on ASP.NET Core integrates with standard ASP.NET Core features like logging, dependency injection (DI), authentication and authorization.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.nuget.org/packages/Grpc.Net.Client" rel="nofollow noopener noreferrer"&gt;Grpc.Net.Client&lt;/a&gt; – A gRPC client for .NET Core that builds upon the familiar &lt;code&gt;HttpClient&lt;/code&gt;. The client uses new HTTP/2 functionality in .NET Core.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.nuget.org/packages/Grpc.Net.ClientFactory" rel="nofollow noopener noreferrer"&gt;Grpc.Net.ClientFactory&lt;/a&gt; – gRPC client integration with &lt;code&gt;HttpClientFactory&lt;/code&gt;. The client factory allows gRPC clients to be centrally configured and injected into your app with DI.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, see &lt;a href="https://docs.microsoft.com/aspnet/core/grpc/" rel="nofollow noopener noreferrer"&gt;An introduction to gRPC on .NET&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;gRPC for .NET is now the recommended implementation!&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Starting from May 2021, gRPC for .NET is the recommended…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/grpc/grpc-dotnet" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h1&gt;
  
  
  Alternate Solution 🎃
&lt;/h1&gt;

&lt;p&gt;Personally I find it easier to forward http calls to a &lt;u&gt;REST API&lt;/u&gt; if you had a stateless server.&lt;/p&gt;

&lt;p&gt;You have more control and i think it is more standard.&lt;/p&gt;

&lt;p&gt;Now imagine that you have 1000+ interfaces with their respective methods.&lt;/p&gt;

&lt;p&gt;How can you redirect those calls to our new REST server?&lt;/p&gt;

&lt;p&gt;Let's take an example to better understand the problem. Below we can see a payment service with a method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IPayment&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Payment&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;Checkout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Basket&lt;/span&gt; &lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;One assumption here (and most of the methods) is that Basket and Payment classes inherits from &lt;a href="https://learn.microsoft.com/es-es/dotnet/api/system.data.dataset?view=netframework-4.8" rel="noopener noreferrer"&gt;System.Data.Dataset&lt;/a&gt; 😨&lt;/p&gt;

&lt;p&gt;One possibility is to use the Service Locator pattern and Inversion of Control.&lt;/p&gt;

&lt;p&gt;Since we have these interfaces, we can decorate them with some attribute that indicates that they participate in IOC.&lt;/p&gt;

&lt;p&gt;Then we can call an instance calling something like:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;IPayment&lt;/span&gt; &lt;span class="n"&gt;payment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ServiceLocator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetInstance&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IPayment&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Checkout&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;But what happens if you are not allowed to use an IOC? (insert multiple and diverse causes here) 😭&lt;/p&gt;

&lt;p&gt;Not everything is lost.&lt;/p&gt;

&lt;p&gt;We can create a class that is a &lt;u&gt;RealProxy&lt;/u&gt; that makes the appropriate calls to the remote server and returns a &lt;u&gt;TransparentProxy&lt;/u&gt;, which as if it were a black box allows us to invoke the methods of our interface and our new server will respond.&lt;/p&gt;

&lt;p&gt;Suppose that in our legacy application we have a static class called &lt;u&gt;RemotingServiceFactory&lt;/u&gt; that returns instances of &lt;u&gt;IPayment&lt;/u&gt; and other services.&lt;/p&gt;

&lt;p&gt;One example of use would be as follows:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This is a Transparent Proxy returned by &lt;/span&gt;
&lt;span class="c1"&gt;// the RemotingServiceFactory class&lt;/span&gt;
&lt;span class="n"&gt;IPayment&lt;/span&gt; &lt;span class="n"&gt;proxy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RemotingServiceFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IPayment&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

&lt;span class="n"&gt;Basket&lt;/span&gt; &lt;span class="n"&gt;basket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddProduct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Product&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Bananas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Quantity&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// This is the actual call to remote service&lt;/span&gt;
&lt;span class="n"&gt;Payment&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Checkout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;We can modify &lt;u&gt;RemotingServiceFactory.GetService&lt;/u&gt; to forward &lt;br&gt;
 calls from some services to our new server and be able to incrementally migrate our services.&lt;/p&gt;

&lt;p&gt;We store the types of those services that we have migrated in a dictionary called &lt;u&gt;_httpServices&lt;/u&gt; so that if when requesting a service, its type is among them, we return our new TransparentProxy.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;GetService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;
&lt;span class="err"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_httpServices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TryGetValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="n"&gt;IInterceptor&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;interceptor&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// New&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;GetHttpService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;interceptor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Legacy&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;GetRemotingService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Wait a minute, what is that interface called &lt;u&gt;IInterceptor&lt;/u&gt;?&lt;/p&gt;

&lt;p&gt;It's a class that intercepts the calls to our &lt;u&gt;IPayment&lt;/u&gt; and other services and make the real call without the need to implement that interface 😎&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SingleDataSetInterceptor&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IInterceptor&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;

    &lt;span class="c1"&gt;// This method is called every time we call a method in our interface&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Intercept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IInvocation&lt;/span&gt; &lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReturnValue&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;InvokeHttpPostAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DeclaringType&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;FullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;
            &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DataSet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetArgumentValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;invocation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReturnType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DataSet&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;InvokeHttpPostAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;classPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;methodName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DataSet&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;parameter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="n"&gt;returnType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ArgumentNullException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ThrowIfNull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;classPath&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;ArgumentNullException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ThrowIfNull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;methodName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;ArgumentNullException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ThrowIfNull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parameter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;HttpResponseMessage&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;_httpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PostAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;classPath&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;methodName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ObjectContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parameter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetType&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;parameter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_httpSendFormatter&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EnsureSuccessStatusCode&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DataSet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAsAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;returnType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_httpReceiveFormatters&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now, we need some magic to glue all the parts, and that glue is the fantastic library &lt;u&gt;Castle.Core&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Castle.Core&lt;/u&gt; includes a lightweight runtime proxy generator that we can use to create TransparentProxies of our interfaces without being implemented.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/castleproject" rel="noopener noreferrer"&gt;
        castleproject
      &lt;/a&gt; / &lt;a href="https://github.com/castleproject/Core" rel="noopener noreferrer"&gt;
        Core
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Castle Core, including Castle DynamicProxy, Logging Services and DictionaryAdapter
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Castle Core&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/castleproject/Coredocs/images/castle-logo.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcastleproject%2FCoredocs%2Fimages%2Fcastle-logo.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Castle Core provides common Castle Project abstractions including logging services. It also features &lt;strong&gt;Castle DynamicProxy&lt;/strong&gt; a lightweight runtime proxy generator, and &lt;strong&gt;Castle DictionaryAdapter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://github.com/castleproject/Coredocs/README.md" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Releases&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://www.nuget.org/packages/Castle.Core/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2963d0da768526bc60fa330686a2472f6c0e84acf02a5a3fe95a7a0ff981213b/68747470733a2f2f696d672e736869656c64732e696f2f6e756765742f762f436173746c652e436f72652e737667" alt="NuGet"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://github.com/castleproject/Core/releases" rel="noopener noreferrer"&gt;Releases&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Debugging symbols are available in symbol packages in the AppVeyor build artifacts since version 4.1.0. For example, &lt;a href="https://ci.appveyor.com/project/castleproject/core/build/4.1.0/artifacts" rel="nofollow noopener noreferrer"&gt;here are the artifacts for 4.1.0&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;License&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Castle Core is © 2004-2022 Castle Project. It is free software, and may be redistributed under the terms of the &lt;a href="http://opensource.org/licenses/Apache-2.0" rel="nofollow noopener noreferrer"&gt;Apache 2.0&lt;/a&gt; license.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributing&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;Browse the &lt;a href="https://github.com/castleproject/Home#its-community-driven" rel="noopener noreferrer"&gt;contributing section&lt;/a&gt; of our &lt;em&gt;Home&lt;/em&gt; repository to get involved.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Building&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;Platforms&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;NuGet Feed&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;Windows &amp;amp; Linux&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://ci.appveyor.com/nuget/core-0mhe40ifodk8" rel="nofollow noopener noreferrer"&gt;Preview Feed&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;On Windows&lt;/h3&gt;

&lt;/div&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;build.cmd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Compilation requires a C# 9 compiler, an up-to-date .NET Core SDK, and MSBuild 15+ (which should be included in the former).&lt;/p&gt;
&lt;p&gt;Running the unit tests additionally requires the .NET Framework 4.6.2+ as well as the .NET Core 2.1, 3.1 and 6.0 runtimes to…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/castleproject/Core" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;ProxyGenerator&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ProxyGenerator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;interceptor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SingleDataSetInterceptor&lt;/span&gt;&lt;span class="p"&gt;(...);&lt;/span&gt;
&lt;span class="c1"&gt;// This is magic !!&lt;/span&gt;
&lt;span class="n"&gt;IPayment&lt;/span&gt; &lt;span class="n"&gt;proxy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateInterfaceProxyWithoutTarget&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IPayment&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;interceptor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Payment&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Checkout&lt;/span&gt;&lt;span class="p"&gt;(...);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If we include this in the private method GetHttpService of the static class &lt;u&gt;RemotingServiceFactory&lt;/u&gt; then we have completed our journey:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;    &lt;span class="c1"&gt;//_generator is a ProxyGenerator&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;GetHttpService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;IInterceptor&lt;/span&gt; &lt;span class="n"&gt;interceptor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="k"&gt;class&lt;/span&gt;
    &lt;span class="err"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_generator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateInterfaceProxyWithoutTarget&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;interceptor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;As allways all the code is hosted in Github.&lt;/p&gt;

&lt;p&gt;Be kind and love your family 💖&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/NetDefender" rel="noopener noreferrer"&gt;
        NetDefender
      &lt;/a&gt; / &lt;a href="https://github.com/NetDefender/InterfaceProxy" rel="noopener noreferrer"&gt;
        InterfaceProxy
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;InterfaceProxy&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;Create lightweight dynamic proxies of Interfaces without Classes through &lt;strong&gt;Castle.Core&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;See &lt;strong&gt;RemotingServiceFactory.GetService&lt;/strong&gt; and &lt;strong&gt;SingleDataSetInterceptor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;See post in &lt;a href="https://dev.to/netdefender/interface-proxy-5djm" rel="nofollow"&gt;https://dev.to/netdefender/interface-proxy-5djm&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/NetDefender/InterfaceProxy" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>csharp</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>SIMD aggregate performance</title>
      <dc:creator>Volatile Delegate</dc:creator>
      <pubDate>Fri, 22 Sep 2023 22:24:59 +0000</pubDate>
      <link>https://dev.to/netdefender/simd-aggregate-performance-222f</link>
      <guid>https://dev.to/netdefender/simd-aggregate-performance-222f</guid>
      <description>&lt;h2&gt;
  
  
  Foreword 🍓
&lt;/h2&gt;

&lt;p&gt;Dotnet provides several classes, some under the &lt;u&gt;System.Runtime.Intrinsics&lt;/u&gt; namespace that allow hardware to execute instructions in &lt;u&gt;parallel&lt;/u&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Runtime.Intrinsics&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;Vector512&lt;/span&gt; &lt;span class="n"&gt;v512&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Vector256&lt;/span&gt; &lt;span class="n"&gt;v256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Vector128&lt;/span&gt; &lt;span class="n"&gt;v128&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The number &lt;u&gt;suffix &lt;/u&gt;(512, 256, 128) indicates the size in bits of the vector that the hardware can process in parallel.&lt;/p&gt;

&lt;p&gt;This has positive impact in operations that performs aggregates, specially in a loop with large arrays.&lt;/p&gt;

&lt;p&gt;To know if the hardware allows this type of registers we can consult the static read-only property &lt;u&gt;IsHardwareAccelerated&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Vector256&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsHardwareAccelerated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_is256&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The above code will test if our hardware supports 256 bit vector operations through JIT intrinsics.&lt;/p&gt;
&lt;h2&gt;
  
  
  Exploring 🧠
&lt;/h2&gt;

&lt;p&gt;Suppose we want to simultaneously calculate the maximum and minimum of a sequence of integers using &lt;u&gt;Vector256&lt;/u&gt;.&lt;/p&gt;

&lt;p&gt;The process will consist of creating a loop in which we will move forward taking 256-bit chunks and updating the maximum and minimum&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;Min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;Max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;MinMax256&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;ReadOnlySpan&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;INumber&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;First we initialize some variables to hold the current element, the last element, and the last size wise element (the &lt;u&gt;to &lt;/u&gt;variable)&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;MemoryMarshal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;Unsafe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;Unsafe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Vector256&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Vector256&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;minElement&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Vector256&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LoadUnsafe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Vector256&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;maxElement&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;minElement&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then we start the loop. Inside, we load data in 256 bit chunks calling &lt;u&gt;Vector256.LoadUsafe&lt;/u&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Unsafe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsAddressLessThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;Vector256&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tempElement&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Vector256&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LoadUnsafe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="n"&gt;minElement&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Vector256&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tempElement&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="n"&gt;maxElement&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Vector256&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maxElement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tempElement&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;Unsafe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Vector256&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;We use the static Min and Max methods of &lt;u&gt;Vector256&lt;/u&gt;and store the value in minElement and maxElement.&lt;/p&gt;

&lt;p&gt;Finally, we increment the position counter (current) by adding 256 bits to the pointer.&lt;/p&gt;

&lt;p&gt;Once we have exceeded the established size, we have to calculate the maximum and minimum individually&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;minElement&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maxElement&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;Vector256&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="n"&gt;Count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;tempMin&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;minElement&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tempMin&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;min&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tempMin&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;tempMax&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maxElement&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tempMax&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tempMax&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;After that we calculate the remaining elements if any:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Unsafe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsAddressLessThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;min&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;Unsafe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ref&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And that's all, we return the results:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Benchmark 🔥
&lt;/h2&gt;

&lt;p&gt;A quick test with BenchmarkDotnet calculating the maximum and minimum of an array of 10_000 integers reveals a performance improvement of &lt;u&gt;x146 &lt;/u&gt;with Vector256 support.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Ryzen 7 1700, 1 CPU &lt;br&gt;
.NET SDK=8.0.100-rc.1.23455.8&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Mean (ns)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🐢 MinMaxLinq  .NET Framework 4.8&lt;/td&gt;
&lt;td&gt;118,675.226&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚡ &lt;u&gt;MinMaxSimd  .NET 8.0&lt;/u&gt;
&lt;/td&gt;
&lt;td&gt;&lt;u&gt;808.150&lt;/u&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Farewell
&lt;/h2&gt;

&lt;p&gt;All the code with a more elavorated example is hosted in github. Be happy and love your family 💖&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/NetDefender"&gt;
        NetDefender
      &lt;/a&gt; / &lt;a href="https://github.com/NetDefender/SimdIteration"&gt;
        SimdIteration
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      SIMD tests
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Simd Iteration&lt;/h1&gt;
&lt;p&gt;Test SIMD 512, 256, 128 registers for fast aggregate calculations.&lt;/p&gt;
&lt;p&gt;Unfortunately my hardware doesn't support Vector512.&lt;/p&gt;
&lt;p&gt;Anyway, the performance improvement is mindblowing.&lt;/p&gt;
&lt;div class="markdown-alert markdown-alert-important"&gt;
&lt;p class="markdown-alert-title"&gt;Important&lt;/p&gt;
&lt;p&gt;net8 is x146 times faster than net48 for calculate the Min and Max at the same time !!&lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt;
Results&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;BenchmarkDotNet=v0.13.5, OS=Windows 10 (10.0.19044.3086/21H2/November2021Update)&lt;/li&gt;
&lt;li&gt;AMD Ryzen 7 1700, 1 CPU, 16 logical and 8 physical cores&lt;/li&gt;
&lt;li&gt;.NET SDK=8.0.100-rc.1.23455.8&lt;/li&gt;
&lt;li&gt;[Host]             : .NET 8.0.0 (8.0.23.41904), X64 RyuJIT AVX2&lt;/li&gt;
&lt;li&gt;.NET 7.0           : .NET 7.0.11 (7.0.1123.42427), X64 RyuJIT AVX2&lt;/li&gt;
&lt;li&gt;.NET 8.0           : .NET 8.0.0 (8.0.23.41904), X64 RyuJIT AVX2&lt;/li&gt;
&lt;li&gt;.NET Framework 4.8 : .NET Framework 4.8 (4.8.4644.0), X64 RyuJIT VectorSize=256&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;Allocated&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MinMaxLinq&lt;/td&gt;
&lt;td&gt;.NET Framework 4.8&lt;/td&gt;
&lt;td&gt;10000&lt;/td&gt;
&lt;td&gt;118,675.226 ns&lt;/td&gt;
&lt;td&gt;65 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinMaxLinq&lt;/td&gt;
&lt;td&gt;.NET 7.0&lt;/td&gt;
&lt;td&gt;10000&lt;/td&gt;
&lt;td&gt;2,350.046 ns&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinMaxLinq&lt;/td&gt;
&lt;td&gt;.NET 8.0&lt;/td&gt;
&lt;td&gt;10000&lt;/td&gt;
&lt;td&gt;1,228.518 ns&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MinMaxSimd&lt;/td&gt;
&lt;td&gt;.NET 7.0&lt;/td&gt;
&lt;td&gt;10000&lt;/td&gt;
&lt;td&gt;834.291 ns&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MinMaxSimd&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;.NET 8.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10000&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;808.150 ns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;/div&gt;

  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/NetDefender/SimdIteration"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://learn.microsoft.com/es-es/dotnet/api/system.runtime.intrinsics?view=net-8.0" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--iMpGPUDN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://learn.microsoft.com/en-us/media/open-graph-image.png" height="420" class="m-0" width="800"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://learn.microsoft.com/es-es/dotnet/api/system.runtime.intrinsics?view=net-8.0" rel="noopener noreferrer" class="c-link"&gt;
          System.Runtime.Intrinsics Espacio de nombres | Microsoft Learn
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;p class="truncate-at-3"&gt;
          Contiene tipos que se usan para crear y transmitir estados de registro de distintos tamaños y formatos para su uso con las extensiones del conjunto de instrucciones. Para obtener instrucciones sobre cómo manipular estos registros, vea System.Runtime.Intrinsics.X86 y System.Runtime.Intrinsics.Arm. 
        &lt;/p&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
        learn.microsoft.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/dotnet/runtime/issues/79005"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://res.cloudinary.com/practicaldev/image/fetch/s--A9-wwsHG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        System.Runtime.Intrinsics work planned for .NET 8
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#79005&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/dakersnar"&gt;
        &lt;img class="github-liquid-tag-img" src="https://res.cloudinary.com/practicaldev/image/fetch/s--A_tiAeG7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://avatars.githubusercontent.com/u/18474647%3Fv%3D4" alt="dakersnar avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/dakersnar"&gt;dakersnar&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/dotnet/runtime/issues/79005"&gt;&lt;time&gt;Nov 29, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;&lt;strong&gt;This is a work in progress as we develop our .NET 8 plans. This list is expected to change throughout the release cycle according to ongoing planning and discussions, with possible additions and subtractions to the scope.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="user-content-summary"&gt;Summary&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/h2&gt;
&lt;p&gt;During .NET 8, we will be focusing on AVX-512, an effort that includes the addition of a new intrinsic type &lt;code&gt;Vector512&lt;/code&gt; as well as &lt;code&gt;Vector&amp;lt;T&amp;gt;&lt;/code&gt; improvements. Beyond that major theme, we will invest in quality, enhancements and new APIs. This is an ambitious set of work, so it's likely that several of the items below will be pushed out beyond .NET 8. It is also likely additional items will be added throughout the year.&lt;/p&gt;
&lt;h2 id="user-content-planned-for-net-8"&gt;Planned for .NET 8&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/h2&gt;
&lt;h3 id="user-content-avx-512"&gt;AVX-512&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[ ] &lt;a href="https://github.com/dotnet/runtime/issues/63331"&gt;https://github.com/dotnet/runtime/issues/63331&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href="https://github.com/dotnet/runtime/issues/73262"&gt;https://github.com/dotnet/runtime/issues/73262&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;a href="https://github.com/dotnet/runtime/issues/73604"&gt;https://github.com/dotnet/runtime/issues/73604&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href="https://github.com/dotnet/runtime/issues/74613"&gt;https://github.com/dotnet/runtime/issues/74613&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href="https://github.com/dotnet/runtime/issues/74813"&gt;https://github.com/dotnet/runtime/issues/74813&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;a href="https://github.com/dotnet/runtime/issues/76244"&gt;https://github.com/dotnet/runtime/issues/76244&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;a href="https://github.com/dotnet/runtime/issues/76579"&gt;https://github.com/dotnet/runtime/issues/76579&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href="https://github.com/dotnet/runtime/issues/76593"&gt;https://github.com/dotnet/runtime/issues/76593&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="user-content-quality"&gt;Quality&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[ ] &lt;a href="https://github.com/dotnet/runtime/issues/64409"&gt;https://github.com/dotnet/runtime/issues/64409&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[ ] &lt;a href="https://github.com/dotnet/runtime/issues/64451"&gt;https://github.com/dotnet/runtime/issues/64451&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="user-content-enhancements--new-apis"&gt;Enhancements / New APIs&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[ ] &lt;a href="https://github.com/dotnet/runtime/issues/28711"&gt;https://github.com/dotnet/runtime/issues/28711&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href="https://github.com/dotnet/runtime/issues/53730"&gt;https://github.com/dotnet/runtime/issues/53730&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;a href="https://github.com/dotnet/runtime/issues/75084"&gt;https://github.com/dotnet/runtime/issues/75084&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/dotnet/runtime/issues/79005"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
      &lt;div class="c-embed__cover"&gt;
        &lt;a href="https://devblogs.microsoft.com/dotnet/hardware-intrinsics-in-net-core/" class="c-link s:max-w-50 align-middle" rel="noopener noreferrer"&gt;
          &lt;img alt="" src="https://res.cloudinary.com/practicaldev/image/fetch/s--6Qkg4FXD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2019/02/swimlane-cross-platform.png" height="300" class="m-0" width="636"&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;div class="c-embed__body"&gt;
      &lt;h2 class="fs-xl lh-tight"&gt;
        &lt;a href="https://devblogs.microsoft.com/dotnet/hardware-intrinsics-in-net-core/" rel="noopener noreferrer" class="c-link"&gt;
          Hardware Intrinsics in .NET Core - .NET Blog
        &lt;/a&gt;
      &lt;/h2&gt;
      &lt;div class="color-secondary fs-s flex items-center"&gt;
          &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://res.cloudinary.com/practicaldev/image/fetch/s--hk94Rv2x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://devblogs.microsoft.com/dotnet/wp-content/uploads/sites/10/2018/10/Microsoft-Favicon.png" width="18" height="18"&gt;
        devblogs.microsoft.com
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>simd</category>
    </item>
  </channel>
</rss>
