From 7387730a498336c7dc7b89d822c2342a55864600 Mon Sep 17 00:00:00 2001 From: Arslan Alibekov Date: Wed, 28 May 2025 17:33:54 +0300 Subject: [PATCH] improved c# implementation of coro-prime-sieve --- bench/algorithm/coro-prime-sieve/1.cs | 333 ++++++++++++++++++++++++-- 1 file changed, 319 insertions(+), 14 deletions(-) diff --git a/bench/algorithm/coro-prime-sieve/1.cs b/bench/algorithm/coro-prime-sieve/1.cs index 4db246eed..37977114a 100644 --- a/bench/algorithm/coro-prime-sieve/1.cs +++ b/bench/algorithm/coro-prime-sieve/1.cs @@ -24,39 +24,344 @@ public static async Task Main(string[] args) using var cts = new CancellationTokenSource(); var ch = Channel.CreateBounded(s_channelOptions); - _ = GenerateAsync(ch.Writer, cts.Token); + + using var output = Console.OpenStandardOutput(); + + GenerateAsync(ch.Writer, cts.Token); + for (var i = 0; i < n; i++) { - var prime = await ch.Reader.ReadAsync().ConfigureAwait(false); - Console.WriteLine(prime); + if (!ch.Reader.TryRead(out var prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + && !ch.Reader.TryRead(out prime) + ) + { + var readed = ch.Reader.ReadAsync(); + prime = readed.IsCompleted ? readed.Result : await readed.ConfigureAwait(false); + } + + Span f = stackalloc byte[(int)Math.Ceiling(Math.Log10(prime)) + 1]; + var c = prime; + var wI = 2; + while (c != 0) + { + const byte zero = (byte)'0'; + f[^wI] = (byte)(zero + (c % 10)); + c = c / 10; + wI += 1; + } + + f[^1] = (byte)'\n'; + + output.Write(f); + var chNext = Channel.CreateBounded(s_channelOptions); - _ = FilterAsync(ch.Reader, chNext.Writer, prime, cts.Token); + + FilterAsync(ch.Reader, chNext.Writer, prime, cts.Token); + ch = chNext; } cts.Cancel(); } - static async Task GenerateAsync(ChannelWriter writer, CancellationToken ct) + static void GenerateAsync(ChannelWriter writer, CancellationToken ct) { - for (var i = 2; !ct.IsCancellationRequested; i++) + ThreadPool.QueueUserWorkItem(async delegate { - await writer.WriteAsync(i, ct).ConfigureAwait(false); - } + for (var i = 2; !ct.IsCancellationRequested; i++) + { + if (!writer.TryWrite(i)) + { + try + { + var writed = writer.WriteAsync(i, ct); + if (!writed.IsCompleted) await writed; + } + catch { } + } + } + }); } - static async Task FilterAsync( + static void FilterAsync( ChannelReader reader, ChannelWriter writer, int prime, CancellationToken ct) { - while (!ct.IsCancellationRequested) + ThreadPool.QueueUserWorkItem(async delegate { - var n = await reader.ReadAsync(ct).ConfigureAwait(false); - if (n % prime != 0) + while (!ct.IsCancellationRequested) { - await writer.WriteAsync(n, ct).ConfigureAwait(false); + if (!reader.TryRead(out var n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + && !reader.TryRead(out n) + ) + { + try + { + var readed = reader.ReadAsync(ct); + n = readed.IsCompleted ? readed.Result : await readed.ConfigureAwait(false); + } + catch { } + } + + if (n % prime != 0) + { + if (!writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + && !writer.TryWrite(n) + ) + { + try + { + var writed = writer.WriteAsync(n, ct); + if (!writed.IsCompleted) await writed.ConfigureAwait(false); + } + catch { } + } + } } - } + }); } }