<?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: Oleksandr Viktor</title>
    <description>The latest articles on DEV Community by Oleksandr Viktor (@ukrguru).</description>
    <link>https://dev.to/ukrguru</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%2F2645949%2Fc57b0952-c7b2-4419-b654-d898c8c54abf.jpg</url>
      <title>DEV Community: Oleksandr Viktor</title>
      <link>https://dev.to/ukrguru</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ukrguru"/>
    <language>en</language>
    <item>
      <title>WJb 0.28.0 Released 🚀</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Thu, 23 Apr 2026 08:36:03 +0000</pubDate>
      <link>https://dev.to/ukrguru/wjb-0280-released-18ii</link>
      <guid>https://dev.to/ukrguru/wjb-0280-released-18ii</guid>
      <description>&lt;p&gt;WJb 0.28.0 is now available on NuGet.&lt;br&gt;
This release is focused on stability and correctness, especially for long‑running and scheduled workloads:&lt;/p&gt;

&lt;p&gt;Improved internal execution reliability&lt;br&gt;
Better cancellation behavior during delays and iterations&lt;br&gt;
Expanded unit test coverage for worker and scheduler logic&lt;br&gt;
No breaking changes&lt;/p&gt;

&lt;p&gt;If you’re using WJb for background jobs or scheduled processing, this release strengthens the foundations without requiring code changes.&lt;br&gt;
👉 NuGet: &lt;a href="https://www.nuget.org/packages/WJb/0.28.0" rel="noopener noreferrer"&gt;https://www.nuget.org/packages/WJb/0.28.0&lt;/a&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>backend</category>
      <category>dotnet</category>
      <category>news</category>
    </item>
    <item>
      <title>Serious question: at this point… who still needs it faster? 🚀</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Mon, 20 Apr 2026 13:32:27 +0000</pubDate>
      <link>https://dev.to/ukrguru/serious-question-at-this-point-who-still-needs-it-faster-32ni</link>
      <guid>https://dev.to/ukrguru/serious-question-at-this-point-who-still-needs-it-faster-32ni</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffro05uy3wjaqjhols30l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffro05uy3wjaqjhols30l.png" alt=" " width="465" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Benchmarking WJb: Measuring Raw Background Job Throughput in .NET</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Sun, 19 Apr 2026 08:32:23 +0000</pubDate>
      <link>https://dev.to/ukrguru/benchmarking-wjb-measuring-raw-background-job-throughput-in-net-pba</link>
      <guid>https://dev.to/ukrguru/benchmarking-wjb-measuring-raw-background-job-throughput-in-net-pba</guid>
      <description>&lt;h1&gt;
  
  
  Benchmarking WJb: Measuring Raw Background Job Throughput in .NET
&lt;/h1&gt;

&lt;p&gt;When building a background job system, performance questions appear almost immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  How fast can I enqueue jobs?&lt;/li&gt;
&lt;li&gt;  Does it scale with concurrent producers?&lt;/li&gt;
&lt;li&gt;  What happens when payloads are not trivial?&lt;/li&gt;
&lt;li&gt;  Are delayed and timer jobs expensive?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To answer these questions early, &lt;strong&gt;WJb ships with a dedicated benchmark project&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/UkrGuru/WJb" rel="noopener noreferrer"&gt;&lt;code&gt;WJb.Benchmarks&lt;/code&gt;&lt;/a&gt; &lt;a href="https://github.com/UkrGuru/WJb" rel="noopener noreferrer"&gt;[github.com]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This article explains &lt;strong&gt;what exactly is measured&lt;/strong&gt;, &lt;strong&gt;how the benchmarks are structured&lt;/strong&gt;, and &lt;strong&gt;what the numbers really mean&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Benchmark Enqueue Speed First?
&lt;/h2&gt;

&lt;p&gt;WJb is designed as a &lt;strong&gt;lightweight, explicit background job engine&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Unlike full orchestration systems, WJb deliberately avoids:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Persistent storage by default&lt;/li&gt;
&lt;li&gt;  Distributed locks&lt;/li&gt;
&lt;li&gt;  Retries, dashboards, or schedulers baked into the core&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes &lt;strong&gt;enqueue throughput&lt;/strong&gt; a critical foundational metric.&lt;/p&gt;

&lt;p&gt;If placing jobs into the system is slow or unpredictable, &lt;strong&gt;everything else scales poorly&lt;/strong&gt; — regardless of how fast job execution later becomes.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is WJb.Benchmarks?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;WJb.Benchmarks&lt;/code&gt; is a &lt;strong&gt;standalone console benchmark application&lt;/strong&gt; designed to answer one simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How fast can WJb prepare and enqueue jobs under different conditions?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The benchmark project lives under the test folder and is intentionally isolated from production code to keep results clean and reproducible. &lt;a href="https://github.com/UkrGuru/WJb" rel="noopener noreferrer"&gt;[github.com]&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Benchmark Scenarios
&lt;/h2&gt;

&lt;p&gt;The benchmark suite focuses on &lt;strong&gt;enqueue-only performance&lt;/strong&gt; and includes four core scenarios:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Single-threaded enqueue
&lt;/h3&gt;

&lt;p&gt;Measures raw throughput when jobs are enqueued sequentially from a single producer.&lt;/p&gt;

&lt;p&gt;This represents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Simple applications&lt;/li&gt;
&lt;li&gt;  Low-contention background usage&lt;/li&gt;
&lt;li&gt;  Baseline overhead of job creation + JSON compaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why it matters:&lt;br&gt;
Single-thread speed reflects &lt;strong&gt;framework overhead&lt;/strong&gt;, not threading tricks.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Multi-threaded enqueue (concurrent producers)
&lt;/h3&gt;

&lt;p&gt;Uses multiple threads enqueueing jobs simultaneously.&lt;/p&gt;

&lt;p&gt;This simulates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Web APIs enqueueing background work&lt;/li&gt;
&lt;li&gt;  Message-driven systems&lt;/li&gt;
&lt;li&gt;  Burst workloads under pressure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal here is &lt;strong&gt;scalability&lt;/strong&gt;, not just raw numbers.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Heavy JSON payload enqueue
&lt;/h3&gt;

&lt;p&gt;Jobs rarely carry empty payloads in real systems.&lt;/p&gt;

&lt;p&gt;This benchmark measures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  JSON serialization overhead&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;JsonObject&lt;/code&gt; compaction cost&lt;/li&gt;
&lt;li&gt;  Memory pressure from larger payloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The payload is intentionally heavy to reveal realistic performance drops instead of optimistic results.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Delayed / timer job enqueue
&lt;/h3&gt;

&lt;p&gt;Delayed jobs often involve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Extra metadata&lt;/li&gt;
&lt;li&gt;  Timer coordination&lt;/li&gt;
&lt;li&gt;  Scheduling logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This benchmark isolates &lt;strong&gt;enqueue cost only&lt;/strong&gt;, without waiting for execution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benchmark Setup
&lt;/h2&gt;

&lt;p&gt;The benchmarks are intentionally boring — and that’s a feature.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Action implementation&lt;/strong&gt;: minimal &lt;code&gt;IAction&lt;/code&gt; returning &lt;code&gt;Task.CompletedTask&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Execution&lt;/strong&gt;: enqueue only (no worker execution measured)&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Configuration&lt;/strong&gt;: Release build&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Runtime&lt;/strong&gt;: modern .NET&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Environment&lt;/strong&gt;: standard developer machine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No database.&lt;br&gt;&lt;br&gt;
No persistence.&lt;br&gt;&lt;br&gt;
No background threads executing jobs.&lt;/p&gt;

&lt;p&gt;This keeps results focused and repeatable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sample Results
&lt;/h2&gt;

&lt;p&gt;A representative benchmark run looks like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WJb Performance Benchmark Suite
==================================
[Multi-threaded Enqueue]
200,000 jobs from 8 threads → ~320 ms
≈ 600k+ jobs/sec

[Single-thread Enqueue]
100,000 jobs → ~180 ms
≈ 500k+ jobs/sec

[Heavy JSON Payload]
20,000 jobs → ~400 ms
≈ 50k jobs/sec

[Delayed / Timer Jobs]
10,000 jobs → ~30 ms
≈ 330k jobs/sec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Exact numbers will vary per machine. The &lt;strong&gt;trend and scaling behavior&lt;/strong&gt; are what matter.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  How to Read These Numbers (Correctly)
&lt;/h2&gt;

&lt;p&gt;These benchmarks &lt;strong&gt;do not measure job execution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They measure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Job compaction&lt;/li&gt;
&lt;li&gt;  JSON serialization&lt;/li&gt;
&lt;li&gt;  Internal queueing&lt;/li&gt;
&lt;li&gt;  Thread contention behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real-world throughput will depend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The work your jobs perform&lt;/li&gt;
&lt;li&gt;  Worker concurrency&lt;/li&gt;
&lt;li&gt;  Machine resources&lt;/li&gt;
&lt;li&gt;  Whether persistence is added later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But high enqueue performance is still valuable because it ensures:&lt;/p&gt;

&lt;p&gt;✅ predictable latency under load&lt;br&gt;&lt;br&gt;
✅ minimal overhead per job&lt;br&gt;&lt;br&gt;
✅ headroom for future features&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Approach Works
&lt;/h2&gt;

&lt;p&gt;Many job systems optimize dashboards, retries, or storage first.&lt;/p&gt;

&lt;p&gt;WJb does the opposite:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build a fast, explicit, predictable core — then layer complexity consciously.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;WJb.Benchmarks&lt;/code&gt; exists to validate that core continually, not once.&lt;/p&gt;




&lt;h2&gt;
  
  
  Run It Yourself
&lt;/h2&gt;

&lt;p&gt;Clone the repository and run the benchmark project directly:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dotnet run -c Release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Because it’s a plain console app, no infrastructure setup is required.&lt;/p&gt;

&lt;p&gt;Repository:&lt;br&gt;
&lt;a href="https://github.com/UkrGuru/WJb/tree/main/test/WJb.Benchmarks" rel="noopener noreferrer"&gt;https://github.com/UkrGuru/WJb/tree/main/test/WJb.Benchmarks&lt;/a&gt; &lt;a href="https://github.com/UkrGuru/WJb" rel="noopener noreferrer"&gt;[github.com]&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Benchmarks don’t make software good — &lt;strong&gt;discipline does&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But a lightweight job engine that can enqueue &lt;strong&gt;hundreds of thousands of jobs per second&lt;/strong&gt; provides a solid foundation for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  APIs&lt;/li&gt;
&lt;li&gt;  Workers&lt;/li&gt;
&lt;li&gt;  Schedulers&lt;/li&gt;
&lt;li&gt;  Workflow engines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;WJb.Benchmarks&lt;/code&gt; is not about bragging rights — it’s about &lt;strong&gt;knowing the cost of every abstraction you add&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If that philosophy resonates with you, WJb is worth exploring further.&lt;/p&gt;




&lt;h3&gt;
  
  
  Tags
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;.NET&lt;/code&gt; &lt;code&gt;CSharp&lt;/code&gt; &lt;code&gt;Performance&lt;/code&gt; &lt;code&gt;BackgroundJobs&lt;/code&gt; &lt;code&gt;OpenSource&lt;/code&gt;&lt;/p&gt;




</description>
      <category>backenddevelopment</category>
      <category>opensource</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>WJb Hits 700k+ Jobs/sec: Benchmarking the New Lightweight Background Job Library for .NET</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Wed, 15 Apr 2026 12:54:50 +0000</pubDate>
      <link>https://dev.to/ukrguru/-wjb-hits-700k-jobssec-benchmarking-the-new-lightweight-background-job-library-for-net-1ji3</link>
      <guid>https://dev.to/ukrguru/-wjb-hits-700k-jobssec-benchmarking-the-new-lightweight-background-job-library-for-net-1ji3</guid>
      <description>&lt;h1&gt;
  
  
  WJb Hits 700k+ Jobs/sec: Benchmarking the New Lightweight Background Job Library for .NET
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Just hours after its release&lt;/strong&gt;, a brand-new .NET background job library is already showing impressive performance.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;&lt;a href="https://github.com/UkrGuru/WJb" rel="noopener noreferrer"&gt;WJb&lt;/a&gt;&lt;/strong&gt; — a minimal, flexible, and explicit background job execution library built by UkrGuru (Oleksandr Viktor). Released today (April 15, 2026), WJb focuses on simplicity, predictability, and control instead of heavy magic or complex infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why WJb?
&lt;/h2&gt;

&lt;p&gt;While mature solutions like Hangfire and Quartz.NET are powerful, sometimes you just want something &lt;strong&gt;lightweight&lt;/strong&gt; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Priority-based queues&lt;/li&gt;
&lt;li&gt;JSON payloads&lt;/li&gt;
&lt;li&gt;Cron-based scheduling&lt;/li&gt;
&lt;li&gt;Clean DI and &lt;code&gt;IHostedService&lt;/code&gt; integration&lt;/li&gt;
&lt;li&gt;No bloat, no hidden behaviors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WJb promises exactly that: explicit, controllable background job processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Benchmark Suite
&lt;/h2&gt;

&lt;p&gt;I created a dedicated benchmark console app to stress-test WJb right after installation. The suite measures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single-threaded enqueue throughput&lt;/li&gt;
&lt;li&gt;Multi-threaded enqueue scaling (realistic producer load)&lt;/li&gt;
&lt;li&gt;Heavy JSON payload overhead&lt;/li&gt;
&lt;li&gt;Delayed/timer job enqueue speed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Benchmark Setup
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Library&lt;/strong&gt;: WJb v0.26.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;.NET&lt;/strong&gt;: Latest (Release configuration)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware&lt;/strong&gt;: Standard development machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action&lt;/strong&gt;: Minimal &lt;code&gt;IAction&lt;/code&gt; implementation (just returns &lt;code&gt;Task.CompletedTask&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Results (v9 run)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WJb Performance Benchmark Suite v9
==================================

WJb initialized.

[Multi-threaded Enqueue] 200,000 jobs from 8 threads
    → 323.74 ms  |  617,771 jobs/sec

[Single-thread Enqueue] 100,000 jobs
    → 186.07 ms  |  537,419 jobs/sec

[Heavy JSON Payload] 20,000 jobs
    → 404.28 ms  |  49,471 jobs/sec

[Delayed/Timer Jobs] 10,000 jobs
    → 29.66 ms  |  337,187 jobs/sec

✅ Benchmark suite completed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Highlights&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-threaded enqueue&lt;/strong&gt; reached over &lt;strong&gt;617k jobs per second&lt;/strong&gt; — excellent scaling under concurrent load.&lt;/li&gt;
&lt;li&gt;Single-threaded performance stayed consistently above &lt;strong&gt;500k jobs/sec&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Heavy JSON payloads showed the expected drop due to serialization (still very respectable at ~49k/sec).&lt;/li&gt;
&lt;li&gt;Delayed jobs performed well even when using the standard enqueue path.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What These Numbers Mean
&lt;/h2&gt;

&lt;p&gt;These results are &lt;strong&gt;enqueue-only&lt;/strong&gt; benchmarks (measuring how fast we can prepare and queue jobs). Real-world throughput will also depend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How heavy your job actions are&lt;/li&gt;
&lt;li&gt;Number of worker threads configured&lt;/li&gt;
&lt;li&gt;Database/storage backend (if persistence is added later)&lt;/li&gt;
&lt;li&gt;Machine resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Still, hitting &lt;strong&gt;600k+ enqueue operations per second&lt;/strong&gt; on day one is very promising for a lightweight library.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Benchmark Code
&lt;/h2&gt;

&lt;p&gt;You can find the full benchmark project structure and code in my repository (link will be added after publishing). The core pattern follows WJb’s official &lt;code&gt;HelloWJb&lt;/code&gt; sample:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Register actions with &lt;code&gt;services.AddWJb(actions)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;IJobProcessor&lt;/code&gt; + &lt;code&gt;CompactAsync()&lt;/code&gt; + &lt;code&gt;EnqueueJobAsync()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Keep actions simple and idempotent (as recommended by the library)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;WJb is extremely young (literally released today), yet it already shows strong fundamentals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean, minimal API&lt;/li&gt;
&lt;li&gt;Great raw enqueue performance&lt;/li&gt;
&lt;li&gt;Clear focus on predictability over automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need lightweight background jobs without pulling in a full orchestrator, WJb looks like a solid contender worth watching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
&lt;code&gt;.NET&lt;/code&gt;, &lt;code&gt;BackgroundJobs&lt;/code&gt;, &lt;code&gt;Performance&lt;/code&gt;, &lt;code&gt;C#&lt;/code&gt;, &lt;code&gt;OpenSource&lt;/code&gt;, &lt;code&gt;Async&lt;/code&gt;&lt;/p&gt;

</description>
      <category>woker</category>
      <category>scheduller</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>NPoco vs UkrGuru.Sql: When Streaming Beats Buffering</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Thu, 02 Apr 2026 18:29:25 +0000</pubDate>
      <link>https://dev.to/ukrguru/npoco-vs-ukrgurusql-when-streaming-beats-buffering-1kbd</link>
      <guid>https://dev.to/ukrguru/npoco-vs-ukrgurusql-when-streaming-beats-buffering-1kbd</guid>
      <description>&lt;p&gt;When we talk about database performance in .NET, we often compare ORMs as if they were interchangeable. In practice, &lt;strong&gt;the API shape matters just as much as the implementation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this post, I benchmark &lt;strong&gt;NPoco&lt;/strong&gt; and &lt;strong&gt;UkrGuru.Sql&lt;/strong&gt; using BenchmarkDotNet, focusing on a very common task: reading a large table from SQL Server. The interesting part is not &lt;em&gt;which library wins&lt;/em&gt;, but &lt;em&gt;why&lt;/em&gt; the numbers differ so much.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Streaming rows with &lt;code&gt;IAsyncEnumerable&amp;lt;T&amp;gt;&lt;/code&gt; is faster, allocates less, and scales better than loading everything into a list.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Test Scenario
&lt;/h2&gt;

&lt;p&gt;The setup is intentionally simple and realistic.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; SQL Server
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Table:&lt;/strong&gt; &lt;code&gt;Customers&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dataset:&lt;/strong&gt; &lt;code&gt;SampleStoreLarge&lt;/code&gt; (large enough to stress allocations)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Columns:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CustomerId&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FullName&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Email&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CreatedAt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;All benchmarks execute the same SQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;CustomerId&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;Email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CreatedAt&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;Customers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No filters, no projections — just raw read performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Benchmark Code
&lt;/h2&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;BenchmarkDotNet.Attributes&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;Microsoft.Data.SqlClient&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;NPoco&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;UkrGuru.Sql&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SqlBenchmark&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;const&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;ConnectionString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
        &lt;span class="s"&gt;"Server=(local);Database=SampleStoreLarge;Trusted_Connection=True;TrustServerCertificate=True;"&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;const&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;CommandText&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
        &lt;span class="s"&gt;"SELECT CustomerId, FullName, Email, CreatedAt FROM Customers"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&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="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;NPoco_LoadList&lt;/span&gt;&lt;span class="p"&gt;()&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;var&lt;/span&gt; &lt;span class="n"&gt;connection&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;SqlConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConnectionString&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;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OpenAsync&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;var&lt;/span&gt; &lt;span class="n"&gt;db&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;Database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connection&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;list&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;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FetchAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&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;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&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="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;UkrGuru_LoadList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;connection&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;DbHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateConnectionAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConnectionString&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;list&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;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Count&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="n"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&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="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;UkrGuru_StreamRows&lt;/span&gt;&lt;span class="p"&gt;()&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;count&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;await&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;command&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;DbHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateCommandAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ConnectionString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&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;_&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&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="k"&gt;return&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;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All benchmarks were run in &lt;strong&gt;Release mode&lt;/strong&gt; with BenchmarkDotNet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Results (Execution Time)
&lt;/h2&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&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Median&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NPoco_LoadList&lt;/td&gt;
&lt;td&gt;8.23 ms&lt;/td&gt;
&lt;td&gt;0.33 ms&lt;/td&gt;
&lt;td&gt;8.22 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UkrGuru_LoadList&lt;/td&gt;
&lt;td&gt;5.30 ms&lt;/td&gt;
&lt;td&gt;0.57 ms&lt;/td&gt;
&lt;td&gt;5.34 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UkrGuru_StreamRows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.29 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.14 ms&lt;/td&gt;
&lt;td&gt;3.22 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At first glance, streaming is already ~2.5× faster than NPoco. But the real story starts when we look at memory.&lt;/p&gt;




&lt;h2&gt;
  
  
  Results (Memory &amp;amp; GC)
&lt;/h2&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;Gen0&lt;/th&gt;
&lt;th&gt;Gen1&lt;/th&gt;
&lt;th&gt;Gen2&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;NPoco_LoadList&lt;/td&gt;
&lt;td&gt;367&lt;/td&gt;
&lt;td&gt;258&lt;/td&gt;
&lt;td&gt;109&lt;/td&gt;
&lt;td&gt;4.39 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UkrGuru_LoadList&lt;/td&gt;
&lt;td&gt;203&lt;/td&gt;
&lt;td&gt;188&lt;/td&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;2.33 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UkrGuru_StreamRows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;164&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.08 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This table explains almost everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s Actually Being Measured?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  NPoco_LoadList
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Uses &lt;code&gt;FetchAsync&amp;lt;T&amp;gt;()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Fully materializes a &lt;code&gt;List&amp;lt;Customer&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Allocates buffers and intermediate objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Idiomatic NPoco usage&lt;br&gt;&lt;br&gt;
❌ No streaming support&lt;/p&gt;

&lt;p&gt;NPoco optimizes for &lt;strong&gt;developer productivity&lt;/strong&gt;, not minimal allocations. That’s a valid trade‑off, but it shows up clearly in GC pressure.&lt;/p&gt;




&lt;h3&gt;
  
  
  UkrGuru_LoadList
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Also builds a full list&lt;/li&gt;
&lt;li&gt;  Uses a leaner mapping pipeline&lt;/li&gt;
&lt;li&gt;  Roughly &lt;strong&gt;half the allocations&lt;/strong&gt; of NPoco&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Same algorithm as NPoco&lt;br&gt;&lt;br&gt;
✅ Less overhead&lt;/p&gt;

&lt;p&gt;This is a fair apple‑to‑apple comparison with NPoco’s approach.&lt;/p&gt;




&lt;h3&gt;
  
  
  UkrGuru_StreamRows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Uses &lt;code&gt;IAsyncEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  Processes rows one at a time&lt;/li&gt;
&lt;li&gt;  No list allocation&lt;/li&gt;
&lt;li&gt;  No Gen2 collections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ True async streaming&lt;br&gt;&lt;br&gt;
✅ Lowest latency&lt;br&gt;&lt;br&gt;
✅ Most stable GC behavior&lt;/p&gt;

&lt;p&gt;This is not a micro‑optimization — it’s a different execution model.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Streaming Wins
&lt;/h2&gt;

&lt;p&gt;The biggest improvement is &lt;strong&gt;not&lt;/strong&gt; raw speed — it’s &lt;strong&gt;memory behavior&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Fewer allocations&lt;/li&gt;
&lt;li&gt;  Almost no object promotion&lt;/li&gt;
&lt;li&gt;  No Gen2 collections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That matters a lot under real load: ASP.NET requests, background workers, message consumers, etc.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Streaming doesn’t just run faster — it scales better.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  About Fairness
&lt;/h2&gt;

&lt;p&gt;This benchmark is &lt;em&gt;not&lt;/em&gt; trying to prove that one ORM is “better” than another.&lt;/p&gt;

&lt;p&gt;It compares &lt;strong&gt;three distinct patterns&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Buffered list materialization (NPoco)&lt;/li&gt;
&lt;li&gt; Buffered list materialization with fewer abstractions&lt;/li&gt;
&lt;li&gt; True async streaming&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Comparing streaming to buffering is not “ORM vs ORM” — it’s &lt;strong&gt;algorithm vs algorithm&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Should You Use Each?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use NPoco when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You want simple, expressive data access&lt;/li&gt;
&lt;li&gt;  Loading lists is acceptable&lt;/li&gt;
&lt;li&gt;  Developer time matters more than raw throughput&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use streaming (e.g. UkrGuru.Sql) when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Result sets are large&lt;/li&gt;
&lt;li&gt;  Latency and GC pressure matter&lt;/li&gt;
&lt;li&gt;  You want full control over execution&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Benchmarks don’t just measure libraries — they measure &lt;strong&gt;abstractions and APIs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If your workload is dominated by large reads, switching from buffered lists to async streaming can cut both &lt;strong&gt;execution time&lt;/strong&gt; and &lt;strong&gt;memory pressure&lt;/strong&gt; dramatically.&lt;/p&gt;

&lt;p&gt;Choose the tool that matches your &lt;strong&gt;data access pattern&lt;/strong&gt;, not just the one you’re used to.&lt;/p&gt;




</description>
      <category>dotnet</category>
      <category>sqlserver</category>
      <category>bench</category>
    </item>
    <item>
      <title>🚀 Simplify ADO.NET Stream Rows ...</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Wed, 01 Apr 2026 10:04:53 +0000</pubDate>
      <link>https://dev.to/ukrguru/simplify-adonet-stream-rows--48g7</link>
      <guid>https://dev.to/ukrguru/simplify-adonet-stream-rows--48g7</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;SqlLoadListBenchmark – Simple ADO.NET vs UkrGuru.Sql Demo&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;This demo shows how &lt;strong&gt;ADO.NET&lt;/strong&gt; and &lt;strong&gt;UkrGuru.Sql&lt;/strong&gt; perform the same work using different coding styles, along with benchmark results.&lt;/p&gt;




&lt;h2&gt;
  
  
  🖼 &lt;strong&gt;1. LoadList Demo (ADO.NET vs UkrGuru)&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;ADO.NET_LoadList&lt;/strong&gt;
&lt;/h3&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;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="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;ADONET_LoadList&lt;/span&gt;&lt;span class="p"&gt;()&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;list&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;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;conn&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;SqlConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConnectionString&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;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OpenAsync&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;var&lt;/span&gt; &lt;span class="n"&gt;cmd&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;SqlCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;conn&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;var&lt;/span&gt; &lt;span class="n"&gt;reader&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;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ExecuteReaderAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;while&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;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAsync&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;list&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;new&lt;/span&gt; &lt;span class="n"&gt;Customer&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;CustomerId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetInt32&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;FullName&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetString&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;Email&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;CreatedAt&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetDateTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&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;h3&gt;
  
  
  &lt;strong&gt;UkrGuru_LoadList&lt;/strong&gt;
&lt;/h3&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;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="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;UkrGuru_LoadList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;connection&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;DbHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateConnectionAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConnectionString&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;list&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;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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;h2&gt;
  
  
  🖼 &lt;strong&gt;2. StreamRows Demo (ADO.NET vs UkrGuru)&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;ADO.NET_StreamRows&lt;/strong&gt;
&lt;/h3&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;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="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;ADONET_StreamRows&lt;/span&gt;&lt;span class="p"&gt;()&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;count&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;await&lt;/span&gt; &lt;span class="k"&gt;foreach&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;row&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;StreamCustomersAsync&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="n"&gt;IAsyncEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;StreamCustomersAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;EnumeratorCancellation&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&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;var&lt;/span&gt; &lt;span class="n"&gt;conn&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;SqlConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConnectionString&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;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;OpenAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cancellationToken&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;var&lt;/span&gt; &lt;span class="n"&gt;cmd&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;SqlCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;conn&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;var&lt;/span&gt; &lt;span class="n"&gt;reader&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;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ExecuteReaderAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CommandBehavior&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SequentialAccess&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;while&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;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cancellationToken&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Customer&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;CustomerId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetInt32&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;FullName&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetString&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;Email&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;CreatedAt&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetDateTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;3&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;UkrGuru_StreamRows&lt;/strong&gt;
&lt;/h3&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;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="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;UkrGuru_StreamRows&lt;/span&gt;&lt;span class="p"&gt;()&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;count&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;await&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;var&lt;/span&gt; &lt;span class="n"&gt;command&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;DbHelper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateCommandAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CommandText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ConnectionString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&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;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Customer&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="k"&gt;return&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;h2&gt;
  
  
  📊 &lt;strong&gt;Benchmark Results&lt;/strong&gt;
&lt;/h2&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&lt;/th&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ADONET_StreamRows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.953 ms&lt;/td&gt;
&lt;td&gt;0.0472 ms&lt;/td&gt;
&lt;td&gt;0.0441 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UkrGuru_StreamRows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.141 ms&lt;/td&gt;
&lt;td&gt;0.0415 ms&lt;/td&gt;
&lt;td&gt;0.0407 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ADONET_LoadList&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4.309 ms&lt;/td&gt;
&lt;td&gt;0.0721 ms&lt;/td&gt;
&lt;td&gt;0.0675 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UkrGuru_LoadList&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4.713 ms&lt;/td&gt;
&lt;td&gt;0.0908 ms&lt;/td&gt;
&lt;td&gt;0.1116 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📝 Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;StreamRows&lt;/strong&gt;: Both are fast; ADO.NET is slightly faster in this raw sequential benchmark.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;LoadList&lt;/strong&gt;: UkrGuru.Sql is a bit slower in this scenario but provides &lt;strong&gt;much cleaner code&lt;/strong&gt; with far less boilerplate.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Code simplicity vs raw speed&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;  ADO.NET = faster, more verbose&lt;/li&gt;
&lt;li&gt;  UkrGuru.Sql = cleaner, safer, more maintainable
Check it out 👇&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/UkrGuru/Sql/tree/main/demos/SqlLoadListBenchmark" rel="noopener noreferrer"&gt;https://github.com/UkrGuru/Sql/tree/main/demos/SqlLoadListBenchmark&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sqlserver</category>
      <category>dotnet</category>
      <category>database</category>
    </item>
    <item>
      <title>UkrGuru vs Microsoft Copilot: Benchmark Results That Speak for Themselves</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Wed, 25 Mar 2026 14:05:13 +0000</pubDate>
      <link>https://dev.to/ukrguru/ukrguru-vs-microsoft-copilot-benchmark-results-that-speak-for-themselves-4b2a</link>
      <guid>https://dev.to/ukrguru/ukrguru-vs-microsoft-copilot-benchmark-results-that-speak-for-themselves-4b2a</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;UkrGuru vs Microsoft Copilot: Benchmark Results That Speak for Themselves&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;When you optimize for real‑world performance, microseconds matter — sometimes &lt;em&gt;nanoseconds&lt;/em&gt; matter.&lt;br&gt;&lt;br&gt;
This benchmark compares &lt;strong&gt;UkrGuru&lt;/strong&gt; implementations with &lt;strong&gt;Microsoft Copilot‑generated equivalents&lt;/strong&gt; across common low-level operations: primitives, arrays, serialization, and structs.&lt;/p&gt;

&lt;p&gt;The results were surprising — especially considering that Copilot code tends to follow “safe defaults,” while UkrGuru focuses heavily on allocation‑free, branch‑minimal, CPU‑friendly implementation patterns.&lt;/p&gt;

&lt;p&gt;This article summarizes the benchmark results and provides a downloadable table for transparency.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;📊 Benchmark Summary&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The table below shows &lt;strong&gt;Mean execution time&lt;/strong&gt;, &lt;strong&gt;Error&lt;/strong&gt;, &lt;strong&gt;StdDev&lt;/strong&gt;, &lt;strong&gt;Rank&lt;/strong&gt;, and &lt;strong&gt;Memory Allocation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lower &lt;strong&gt;Mean&lt;/strong&gt; and &lt;strong&gt;Rank&lt;/strong&gt; are better.&lt;br&gt;&lt;br&gt;
Lower &lt;strong&gt;Allocated&lt;/strong&gt; (ideally 0 bytes) is also better.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;| Method        | Mean        | Error      | StdDev    | Rank | Gen0   | Allocated |
|-------------- |------------:|-----------:|----------:|-----:|-------:|----------:|
| Ukr_Bool      |   0.9436 ns |  0.0552 ns | 0.0030 ns |    2 |      - |         - |
| Cop_Bool      |   5.5047 ns |  0.2465 ns | 0.0135 ns |    4 |      - |         - |
| Ukr_Int       |   5.4953 ns |  0.6840 ns | 0.0375 ns |    4 |      - |         - |
| Cop_Int       |  12.9375 ns |  0.1144 ns | 0.0063 ns |    8 |      - |         - |
| Ukr_Double    |  23.5338 ns |  0.9775 ns | 0.0536 ns |   13 |      - |         - |
| Cop_Double    |  22.5574 ns |  1.4858 ns | 0.0814 ns |   12 |      - |         - |
| Ukr_Decimal   |  29.7762 ns |  0.9910 ns | 0.0543 ns |   15 |      - |         - |
| Cop_Decimal   |  30.6302 ns |  2.3973 ns | 0.1314 ns |   16 |      - |         - |
| Ukr_Guid      |  12.7784 ns |  0.3671 ns | 0.0201 ns |    7 |      - |         - |
| Cop_Guid      |  12.1073 ns |  1.8873 ns | 0.1035 ns |    6 |      - |         - |
| Ukr_DateOnly  |  52.5456 ns |  2.6977 ns | 0.1479 ns |   17 |      - |         - |
| Cop_DateOnly  |  57.3368 ns |  2.9485 ns | 0.1616 ns |   18 | 0.0036 |      48 B |
| Ukr_TimeOnly  | 109.1004 ns |  1.9878 ns | 0.1090 ns |   20 |      - |         - |
| Cop_TimeOnly  | 119.5629 ns | 10.2523 ns | 0.5620 ns |   21 | 0.0041 |      56 B |
| Ukr_TimeSpan  |  52.4028 ns |  1.9116 ns | 0.1048 ns |   17 |      - |         - |
| Cop_TimeSpan  |  62.9908 ns | 15.9374 ns | 0.8736 ns |   19 | 0.0030 |      40 B |
| Ukr_ByteArray |  15.5711 ns |  0.7072 ns | 0.0388 ns |    9 | 0.0055 |      72 B |
| Cop_ByteArray |  15.7549 ns |  0.7830 ns | 0.0429 ns |   10 | 0.0055 |      72 B |
| Ukr_CharArray |   0.9538 ns |  0.3159 ns | 0.0173 ns |    3 |      - |         - |
| Cop_CharArray |   0.8838 ns |  0.1034 ns | 0.0057 ns |    1 |      - |         - |
| Ukr_Serialize |   5.6374 ns |  0.6384 ns | 0.0350 ns |    5 | 0.0043 |      56 B |
| Cop_Serialize |  12.0702 ns |  0.5457 ns | 0.0299 ns |    6 | 0.0067 |      88 B |
| Ukr_Enum      |  24.4368 ns |  2.8392 ns | 0.1556 ns |   14 | 0.0018 |      24 B |
| Cop_Enum      |  21.3234 ns |  1.0134 ns | 0.0555 ns |   11 | 0.0043 |      56 B |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🔥 Key Observations&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. UkrGuru wins most primitive operations&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Especially in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Bool&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Int&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Decimal&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;TimeSpan&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These results highlight extremely efficient, allocation‑free handling of simple .NET types.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. Copilot sometimes wins — but only occasionally&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;There &lt;em&gt;are&lt;/em&gt; categories where Copilot’s code came out slightly ahead (e.g., &lt;code&gt;CharArray&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;This is good — benchmarks should challenge both sides.&lt;br&gt;&lt;br&gt;
It makes the overall results more meaningful.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Memory allocations reveal the biggest gap&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In several operations, Copilot-generated code allocates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;48 B&lt;/strong&gt; in &lt;code&gt;DateOnly&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;56 B&lt;/strong&gt; in &lt;code&gt;TimeOnly&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;40 B&lt;/strong&gt; in &lt;code&gt;TimeSpan&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;88 B&lt;/strong&gt; in &lt;code&gt;Serialize&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;56 B&lt;/strong&gt; in Enum conversions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meanwhile, most UkrGuru methods remain &lt;strong&gt;0‑allocation&lt;/strong&gt;, which is critical for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  high-throughput APIs&lt;/li&gt;
&lt;li&gt;  microservices&lt;/li&gt;
&lt;li&gt;  real-time pipelines&lt;/li&gt;
&lt;li&gt;  game loops&lt;/li&gt;
&lt;li&gt;  tight CPU‑bound workloads&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🤖 Why Copilot Can’t Keep Up&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Microsoft Copilot is &lt;strong&gt;great at generating safe general-purpose code&lt;/strong&gt;, but not specialized for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  nanosecond‑level optimization&lt;/li&gt;
&lt;li&gt;  allocation‑free pipelines&lt;/li&gt;
&lt;li&gt;  branch elimination&lt;/li&gt;
&lt;li&gt;  struct‑level micro-optimizations&lt;/li&gt;
&lt;li&gt;  IL-friendly patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s exactly where &lt;strong&gt;UkrGuru&lt;/strong&gt; excels — handcrafted low-level performance-oriented code.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;🏁 Conclusion&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This benchmark doesn’t say “Copilot is bad.”&lt;br&gt;&lt;br&gt;
It simply shows that &lt;strong&gt;generic AI-generated code cannot outperform hand‑tuned, purpose-built UkrGuru implementations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If your application needs maximum performance with minimal allocations — UkrGuru wins.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;📦 Want to reproduce the benchmark?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Full source code, including benchmark classes and configuration, is available here:&lt;/p&gt;

&lt;p&gt;👉 &lt;em&gt;&lt;a href="https://github.com/UkrGuru/Sql/tree/main/dev/ResultsBench/ResultsBench" rel="noopener noreferrer"&gt;https://github.com/UkrGuru/Sql/tree/main/dev/ResultsBench/ResultsBench&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>dotnet</category>
      <category>programming</category>
    </item>
    <item>
      <title>updated for WJb 0.25.0-beta</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Tue, 13 Jan 2026 05:53:17 +0000</pubDate>
      <link>https://dev.to/ukrguru/updated-for-wjb-0250-beta-e0h</link>
      <guid>https://dev.to/ukrguru/updated-for-wjb-0250-beta-e0h</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/ukrguru" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2645949%2Fc57b0952-c7b2-4419-b654-d898c8c54abf.jpg" alt="ukrguru"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/ukrguru/basics-getting-started-with-wjb-3i3o" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Basics (Getting Started) with WJb&lt;/h2&gt;
      &lt;h3&gt;Oleksandr Viktor ・ Dec 17 '25&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>programming</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>https://github.com/UkrGuru/Sql - simple and the best</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Wed, 08 Oct 2025 19:51:55 +0000</pubDate>
      <link>https://dev.to/ukrguru/httpsgithubcomukrgurusql-simple-and-the-best-3kef</link>
      <guid>https://dev.to/ukrguru/httpsgithubcomukrgurusql-simple-and-the-best-3kef</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://github.com/UkrGuru/Sql" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F08193186a071d84e84549f0456c5709b7ac4e4acb110620b5155363f8029ed36%2FUkrGuru%2FSql" height="600" class="m-0" width="1200"&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://github.com/UkrGuru/Sql" rel="noopener noreferrer" class="c-link"&gt;
            GitHub - UkrGuru/Sql
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Contribute to UkrGuru/Sql development by creating an account on GitHub.
          &lt;/p&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://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg" width="32" height="32"&gt;
          github.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Try UkrGuru.Sql with New Optimized `Results.Parse`</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Thu, 29 May 2025 05:55:41 +0000</pubDate>
      <link>https://dev.to/ukrguru/try-ukrgurusql-with-new-optimized-resultsparse-5ain</link>
      <guid>https://dev.to/ukrguru/try-ukrgurusql-with-new-optimized-resultsparse-5ain</guid>
      <description>&lt;p&gt;Here’s a short article with the requested title:&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Try UkrGuru.Sql with New Optimized &lt;code&gt;Results.Parse&lt;/code&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The latest release of &lt;strong&gt;UkrGuru.Sql&lt;/strong&gt; introduces a powerful enhancement: an optimized &lt;code&gt;Results.Parse&lt;/code&gt; method designed to streamline how developers handle SQL query results in .NET applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 What’s New?
&lt;/h3&gt;

&lt;p&gt;The new &lt;code&gt;Results.Parse&lt;/code&gt; method significantly improves performance and usability by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Faster parsing&lt;/strong&gt; of SQL result sets into .NET objects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced memory footprint&lt;/strong&gt; for large datasets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved error handling&lt;/strong&gt; and type safety&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplified syntax&lt;/strong&gt; for cleaner, more maintainable code&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📊 Benchmark Results
&lt;/h3&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&lt;/th&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Gen0&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;ResultsNew_ToStr&lt;/td&gt;
&lt;td&gt;541.0 ns&lt;/td&gt;
&lt;td&gt;66.87 ns&lt;/td&gt;
&lt;td&gt;3.67 ns&lt;/td&gt;
&lt;td&gt;0.0830&lt;/td&gt;
&lt;td&gt;1096 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ResultsOld_ToStr&lt;/td&gt;
&lt;td&gt;2,195.4 ns&lt;/td&gt;
&lt;td&gt;177.93 ns&lt;/td&gt;
&lt;td&gt;9.75 ns&lt;/td&gt;
&lt;td&gt;0.1411&lt;/td&gt;
&lt;td&gt;1872 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ResultsNew_FromStr&lt;/td&gt;
&lt;td&gt;1,021.9 ns&lt;/td&gt;
&lt;td&gt;85.43 ns&lt;/td&gt;
&lt;td&gt;4.68 ns&lt;/td&gt;
&lt;td&gt;0.0629&lt;/td&gt;
&lt;td&gt;840 B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ResultsOld_FromStr&lt;/td&gt;
&lt;td&gt;1,521.0 ns&lt;/td&gt;
&lt;td&gt;166.13 ns&lt;/td&gt;
&lt;td&gt;9.11 ns&lt;/td&gt;
&lt;td&gt;0.0515&lt;/td&gt;
&lt;td&gt;696 B&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These results show a clear performance gain in both serialization and deserialization with the new implementation.&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;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[]&lt;/span&gt; &lt;span class="n"&gt;_oInputs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;DBNull&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;false&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="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;DateOnly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;DateTimeOffset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;TimeOnly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MaxValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sc"&gt;'A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"AV &amp;amp; ASD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Encoding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UTF8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AV &amp;amp; ASD"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="sc"&gt;'A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'V'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'&amp;amp;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'S'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'D'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;TestEnum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;One&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;//new string[] { "A", "V", "&amp;amp;", "A", "S", "D" },&lt;/span&gt;
    &lt;span class="c1"&gt;//new NamedType { Id = 1, Name = "Test" }&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[]&lt;/span&gt; &lt;span class="nf"&gt;ResultsNew_ToStr&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[]&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[&lt;/span&gt;&lt;span class="n"&gt;_oInputs&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;for&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;i&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;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;values&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="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;values&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;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;?&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_oInputs&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="c1"&gt;//Console.WriteLine(values[i]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;values&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="n"&gt;Benchmark&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[]&lt;/span&gt; &lt;span class="nf"&gt;ResultsNew_FromStr&lt;/span&gt;&lt;span class="p"&gt;()&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;index&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="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[]&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?[&lt;/span&gt;&lt;span class="n"&gt;_sInputs&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="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;?&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&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="c1"&gt;// null&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&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;// false&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// byte&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// short&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// int&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// long&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// float&lt;/span&gt;
    &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt; &lt;span class="c1"&gt;//values[index++] = ResultsNew.Parse&amp;lt;double&amp;gt;(_sInputs[8]); // double&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// decimal&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DateOnly&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&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;// DateOnly&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// DateTime&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DateTimeOffset&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// DateTime&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TimeOnly&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// TimeOnly&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// TimeOnly&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// Guid&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// char&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;17&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// string&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;]&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// byte[]&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;]&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// char[]&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;++]&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResultsNew&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;TestEnum&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;_sInputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt; &lt;span class="c1"&gt;// enum&lt;/span&gt;
    &lt;span class="c1"&gt;//values[index++] = ResultsNew.Parse&amp;lt;string[]&amp;gt;(_sInputs[21]); // string[]&lt;/span&gt;
    &lt;span class="c1"&gt;//values[index++] = ResultsNew.Parse&amp;lt;NamedType&amp;gt;(_sInputs[22]);&lt;/span&gt;

    &lt;span class="c1"&gt;//for (var i = 0; i &amp;lt; values.Length; i++)&lt;/span&gt;
    &lt;span class="c1"&gt;//{&lt;/span&gt;
    &lt;span class="c1"&gt;//    Console.WriteLine(values[i]);&lt;/span&gt;
    &lt;span class="c1"&gt;//}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;values&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;h3&gt;
  
  
  🛠️ Why It Matters
&lt;/h3&gt;

&lt;p&gt;Whether you're building APIs, background services, or data-driven applications, the optimized &lt;code&gt;Results.Parse&lt;/code&gt; helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimize boilerplate code&lt;/li&gt;
&lt;li&gt;Improve application responsiveness&lt;/li&gt;
&lt;li&gt;Focus more on business logic and less on data plumbing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📦 Ready to Explore?
&lt;/h3&gt;

&lt;p&gt;Check out the package on &lt;a href="https://www.nuget.org/packages/UkrGuru.Sql" rel="noopener noreferrer"&gt;NuGet&lt;/a&gt; and start building smarter, faster, and cleaner SQL-powered .NET apps today.&lt;/p&gt;




&lt;p&gt;Would you like this article formatted for a blog post, social media, or a README file?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>sqlserver</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Insider Info About the New Results Class in Benchmark</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Sun, 23 Feb 2025 18:51:07 +0000</pubDate>
      <link>https://dev.to/ukrguru/insider-info-about-the-new-results-class-in-benchmark-b51</link>
      <guid>https://dev.to/ukrguru/insider-info-about-the-new-results-class-in-benchmark-b51</guid>
      <description>&lt;h1&gt;
  
  
  Insider Info About the New Results Class in Benchmark
&lt;/h1&gt;

&lt;p&gt;The world of performance benchmarking is always evolving, and recent updates to the &lt;code&gt;Sql&lt;/code&gt; repository by UkrGuru have introduced an exciting new &lt;code&gt;Results&lt;/code&gt; class in the &lt;code&gt;BenchResults&lt;/code&gt; namespace. This article dives into the details of this new implementation, comparing it to its predecessor, and showcasing the performance improvements it brings to the table. Let’s explore what’s under the hood, based on the latest insights from the &lt;a href="https://github.com/UkrGuru/Sql/blob/main/benchmark/BenchResults/Program.cs" rel="noopener noreferrer"&gt;Program.cs file&lt;/a&gt; in the benchmark suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmark Setup
&lt;/h2&gt;

&lt;p&gt;The benchmarks were run using &lt;strong&gt;BenchmarkDotNet v0.14.0&lt;/strong&gt; on the following system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OS&lt;/strong&gt;: Windows 11 (10.0.26100.3194)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU&lt;/strong&gt;: 12th Gen Intel Core i7-12700K (1 CPU, 20 logical and 12 physical cores)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;.NET SDK&lt;/strong&gt;: 9.0.200
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime&lt;/strong&gt;: .NET 9.0.2 (9.0.225.6610), X64 RyuJIT AVX2 [AttachedDebugger]
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job&lt;/strong&gt;: ShortRun (IterationCount=3, LaunchCount=1, WarmupCount=3)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This setup ensures a modern, high-performance environment to test the new &lt;code&gt;Results&lt;/code&gt; class against the older &lt;code&gt;ParseOld&lt;/code&gt; implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results: Old vs. New
&lt;/h2&gt;

&lt;p&gt;The benchmark compares two methods: &lt;code&gt;ParseOld_40_results&lt;/code&gt; (the legacy approach) and &lt;code&gt;ResultsNew_40_results&lt;/code&gt; (the new implementation). Here’s how they stack up:&lt;/p&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&lt;/th&gt;
&lt;th&gt;Error&lt;/th&gt;
&lt;th&gt;StdDev&lt;/th&gt;
&lt;th&gt;Gen0&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;ParseOld_40_results&lt;/td&gt;
&lt;td&gt;2.056 μs&lt;/td&gt;
&lt;td&gt;0.1926 μs&lt;/td&gt;
&lt;td&gt;0.0106 μs&lt;/td&gt;
&lt;td&gt;0.1450&lt;/td&gt;
&lt;td&gt;1.86 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ResultsNew_40_results&lt;/td&gt;
&lt;td&gt;1.056 μs&lt;/td&gt;
&lt;td&gt;0.0520 μs&lt;/td&gt;
&lt;td&gt;0.0028 μs&lt;/td&gt;
&lt;td&gt;0.0973&lt;/td&gt;
&lt;td&gt;1.25 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Key Takeaways
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance Boost&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
The new &lt;code&gt;ResultsNew_40_results&lt;/code&gt; method clocks in at a mean execution time of &lt;strong&gt;1.056 microseconds&lt;/strong&gt;, a remarkable improvement over the older &lt;code&gt;ParseOld_40_results&lt;/code&gt; method’s &lt;strong&gt;2.056 microseconds&lt;/strong&gt;. That’s nearly a &lt;strong&gt;50% reduction&lt;/strong&gt; in execution time!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stability&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
The new implementation shows significantly lower variability, with an error of &lt;strong&gt;0.0520 μs&lt;/strong&gt; and a standard deviation of &lt;strong&gt;0.0028 μs&lt;/strong&gt;, compared to &lt;strong&gt;0.1926 μs&lt;/strong&gt; and &lt;strong&gt;0.0106 μs&lt;/strong&gt; for the old method. This suggests the new class is not only faster but also more consistent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Memory Efficiency&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Memory usage sees a notable improvement as well. The &lt;code&gt;ResultsNew_40_results&lt;/code&gt; method allocates just &lt;strong&gt;1.25 KB&lt;/strong&gt; with a Gen0 collection rate of &lt;strong&gt;0.0973&lt;/strong&gt;, down from &lt;strong&gt;1.86 KB&lt;/strong&gt; and &lt;strong&gt;0.1450&lt;/strong&gt; in the old method. This reduction in memory footprint could be a game-changer for large-scale applications.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What’s Driving the Improvement?
&lt;/h2&gt;

&lt;p&gt;While the exact implementation details of the &lt;code&gt;Results&lt;/code&gt; class aren’t fully exposed in the benchmark file, the numbers hint at some clever optimizations. Likely candidates include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Optimized Parsing Logic&lt;/strong&gt;: The new class may employ a more efficient algorithm for handling the 40 results, reducing computational overhead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Object Overhead&lt;/strong&gt;: The drop in memory allocation suggests fewer temporary objects or a more streamlined data structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better Use of .NET 9 Features&lt;/strong&gt;: Running on .NET 9.0.2 with RyuJIT AVX2, the new class might leverage modern runtime enhancements for better performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a deeper dive into the code, check out the &lt;a href="https://github.com/UkrGuru/Sql/blob/main/benchmark/BenchResults/ResultsNew.cs" rel="noopener noreferrer"&gt;source file&lt;/a&gt; directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Matters
&lt;/h2&gt;

&lt;p&gt;For developers working with the &lt;code&gt;Sql&lt;/code&gt; library, this upgrade could mean faster query result processing and lower resource consumption—crucial for high-performance applications. Whether you’re building a data-intensive service or optimizing an existing system, the new &lt;code&gt;Results&lt;/code&gt; class offers a compelling reason to update.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The introduction of the &lt;code&gt;Results&lt;/code&gt; class in UkrGuru’s &lt;code&gt;Sql&lt;/code&gt; repository marks a significant leap forward in performance and efficiency. With a near 50% reduction in execution time, improved stability, and a lighter memory footprint, it’s clear that this isn’t just a minor tweak—it’s a reimagining of how results are handled. Keep an eye on this project as it continues to evolve, and consider integrating these improvements into your own workflows.&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>sqlserver</category>
      <category>beginners</category>
      <category>coding</category>
    </item>
    <item>
      <title>How Grok 3 and xUnit Tests Helped Craft an Ideal `Results` Class</title>
      <dc:creator>Oleksandr Viktor</dc:creator>
      <pubDate>Thu, 20 Feb 2025 11:06:38 +0000</pubDate>
      <link>https://dev.to/ukrguru/how-grok-3-and-xunit-tests-helped-craft-an-ideal-results-class-1fnl</link>
      <guid>https://dev.to/ukrguru/how-grok-3-and-xunit-tests-helped-craft-an-ideal-results-class-1fnl</guid>
      <description>&lt;p&gt;In the world of software development, creating robust, reliable code is both an art and a science. For Oleksandr Viktor (UkrGuru), a passionate developer whose life revolves around programming, this pursuit led to an impressive collaboration with Grok 3—an AI assistant from xAI—and the power of xUnit testing. Together, they transformed an initial open-source &lt;code&gt;Results&lt;/code&gt; class into a near-perfect utility for parsing data, now battle-tested and ready for developers everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Starting Point
&lt;/h2&gt;

&lt;p&gt;The journey began with an open-source &lt;code&gt;Results&lt;/code&gt; class, available at &lt;a href="https://github.com/UkrGuru/Sql/blob/main/src/Results.cs" rel="noopener noreferrer"&gt;https://github.com/UkrGuru/Sql/blob/main/src/Results.cs&lt;/a&gt;. Designed as part of the UkrGuru.Sql project, this class aimed to parse various data types—primitives, enums, JSON elements, and more—into a target type &lt;code&gt;T&lt;/code&gt;. While functional, it had room for improvement, particularly in handling edge cases like &lt;code&gt;char[]&lt;/code&gt; conversions and enum parsing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter Grok 3 and xUnit
&lt;/h2&gt;

&lt;p&gt;Oleksandr enlisted Grok 3 to rigorously evaluate the &lt;code&gt;Results&lt;/code&gt; class, leveraging its ability to analyze code and suggest improvements. Paired with xUnit—a popular .NET testing framework—the duo embarked on a marathon of test-driven refinement. Grok 3 generated dozens of tests targeting potential weaknesses: type safety, null handling, JSON parsing quirks, enum edge cases, and overflow scenarios. Each test aimed to expose flaws, but Oleksandr’s code proved resilient, passing challenge after challenge with strategic fixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Fixes That Made It Ideal
&lt;/h2&gt;

&lt;p&gt;Two standout improvements emerged from this process:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;char[]&lt;/code&gt; Handling&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Initial Code&lt;/strong&gt;: &lt;code&gt;char[] chars =&amp;gt; (T)(object)new string(chars)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problem&lt;/strong&gt;: This threw &lt;code&gt;InvalidCastException&lt;/code&gt; for non-string targets (e.g., &lt;code&gt;double&lt;/code&gt;), limiting flexibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix&lt;/strong&gt;: &lt;code&gt;char[] chars =&amp;gt; (T)Convert.ChangeType(new string(chars), typeof(T))&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Result&lt;/strong&gt;: Using &lt;code&gt;Convert.ChangeType&lt;/code&gt;, the code now converts &lt;code&gt;char[]&lt;/code&gt; to a wide range of types (e.g., &lt;code&gt;"123"&lt;/code&gt; to &lt;code&gt;123.0&lt;/code&gt; for &lt;code&gt;double&lt;/code&gt;), throwing appropriate exceptions only when truly invalid—enhancing type safety and versatility.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Enum Parsing&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Initial Code&lt;/strong&gt;: &lt;code&gt;Type t when t.IsEnum =&amp;gt; (T)Enum.Parse(t, value.ToString()!)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problem&lt;/strong&gt;: Threw generic &lt;code&gt;ArgumentException&lt;/code&gt; for invalid values, lacking specificity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt; &lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsEnum&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&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="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TryParse&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="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsDefined&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="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
         &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentException&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;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;' is not a valid value for enum &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="n"&gt;Name&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;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Result&lt;/strong&gt;: Now uses &lt;code&gt;TryParse&lt;/code&gt; with &lt;code&gt;IsDefined&lt;/code&gt; for robust parsing, throwing a custom, informative exception (e.g., &lt;code&gt;"'3' is not a valid value for enum TestEnum"&lt;/code&gt;)—improving error clarity and reliability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Power of Collaboration
&lt;/h2&gt;

&lt;p&gt;Grok 3’s relentless test generation—spanning malformed JSON, negative &lt;code&gt;TimeSpan&lt;/code&gt; values, overflow conditions, and more—pushed Oleksandr to refine his code iteratively. xUnit tests provided the proving ground, ensuring each fix held up under scrutiny. Oleksandr’s insight—that .NET 9’s default strict JSON parsing (throwing &lt;code&gt;JsonException&lt;/code&gt; for invalid data like &lt;code&gt;"not-a-number"&lt;/code&gt;)—explained the class’s strict behavior without needing explicit options, sealing its perfection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Developers Should Use It
&lt;/h2&gt;

&lt;p&gt;The resulting &lt;code&gt;Results&lt;/code&gt; class is a gem for .NET developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Versatility&lt;/strong&gt;: Handles primitives, enums, JSON, and &lt;code&gt;char[]&lt;/code&gt; with ease.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robustness&lt;/strong&gt;: Throws specific exceptions for invalid inputs, aligning with a fail-fast philosophy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simplicity&lt;/strong&gt;: Clean, concise switch expressions make it maintainable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Source&lt;/strong&gt;: Freely available at &lt;a href="https://github.com/UkrGuru/Sql/blob/main/src/Results.cs" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;—fork it, use it, improve it!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you’re parsing database results, JSON payloads, or custom inputs, this class—forged through Grok 3’s AI-driven testing and Oleksandr’s expertise—offers a reliable, battle-tested solution. Developers seeking a parsing utility that balances flexibility with strictness should give it a spin—it’s as close to ideal as code gets!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fior1c48muh6lsdurrjz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fior1c48muh6lsdurrjz9.png" alt="Image description" width="800" height="762"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
