コード例 #1
0
    // シリアルポート --> 抽象 Stream
    protected override async Task <bool> StreamReadFromObjectImplAsync(FastStreamBuffer fifo, CancellationToken cancel)
    {
        if (this.SerialPort.IsOpen == false)
        {
            throw new FastBufferDisconnectedException();
        }

        await TaskUtil.DoAsyncWithTimeout(
            async c =>
        {
            using (MemoryHelper.FastAllocMemoryWithUsing(RecvTmpBufferSize, out Memory <byte> buffer))
            {
                int recvSize = await this.Stream.ReadAsync(buffer, cancel);

                if (recvSize <= 0)
                {
                    fifo.Disconnect();
                    return(0);
                }

                fifo.EnqueueWithLock(buffer._SliceHead(recvSize)._CloneMemory(), true);
            }

            return(0);
        },
            cancelProc : () =>
        {
            this.SerialPort.Close();
        },
            cancel : cancel);

        return(true);
    }
コード例 #2
0
        public BufferedLogRoute(string kind, LogPriority minimalPriority, LogInfoOptions infoOptions, int bufferSize) : base(kind, minimalPriority)
        {
            this.LogInfoOptions = infoOptions;
            this.BufferSize     = Math.Max(bufferSize, 1);

            MasterBuffer = new FastStreamBuffer(false, this.BufferSize);
        }
コード例 #3
0
    protected override async Task StreamWriteToObjectImplAsync(FastStreamBuffer fifo, CancellationToken cancel)
    {
        await TaskUtil.DoAsyncWithTimeout(
            async c =>
        {
            bool flush = false;

            using (MemoryHelper.FastAllocMemoryWithUsing(SendTmpBufferSize, out Memory <byte> buffer))
            {
                while (true)
                {
                    int size = fifo.DequeueContiguousSlowWithLock(buffer);
                    if (size == 0)
                    {
                        break;
                    }

                    var dataToSend = buffer.Slice(0, size);

                    await Stream.WriteAsync(dataToSend, cancel);
                    flush = true;
                }
            }

            if (flush)
            {
                await Stream.FlushAsync(cancel);
            }

            return(0);
        },
            cancel: cancel);
    }
コード例 #4
0
    // 抽象 Stream --> シリアルポート
    protected override async Task StreamWriteToObjectImplAsync(FastStreamBuffer fifo, CancellationToken cancel)
    {
        if (this.SerialPort.IsOpen == false)
        {
            throw new FastBufferDisconnectedException();
        }

        await TaskUtil.DoAsyncWithTimeout(
            async c =>
        {
            bool flush = false;

            using (MemoryHelper.FastAllocMemoryWithUsing(SendTmpBufferSize, out Memory <byte> buffer))
            {
                while (true)
                {
                    int size = fifo.DequeueContiguousSlowWithLock(buffer);
                    if (size == 0)
                    {
                        break;
                    }

                    await Stream.WriteAsync(buffer.Slice(0, size), cancel);
                    flush = true;
                }
            }

            if (flush)
            {
                await Stream.FlushAsync(cancel);
            }

            return(0);
        },
            cancelProc : () =>
        {
            this.SerialPort.Close();
        },
            cancel : cancel);
    }
コード例 #5
0
ファイル: Program.cs プロジェクト: dnobori/DNT-Jikken
        static void TestStreamBuffer()
        {
            //TestFifo();



            FastStreamBuffer <byte> new_test_stream_buf()
            {
                FastStreamBuffer <byte> ret = new FastStreamBuffer <byte>();

                ret.Enqueue(new byte[] { 1, 2, 3, });
                ret.Enqueue(new byte[] { 4, 5, 6, 7 });
                ret.Enqueue(new byte[] { 8, 9, 10, 11, 12 });
                ret.Enqueue(new byte[] { 13, 14, 15, 16, 17, 18 });
                return(ret);
            }

            FastDatagramBuffer <int> new_test_datagram_buf()
            {
                var buf = new FastDatagramBuffer <int>();

                buf.EnqueueAll(new int[] { 1, 2, 3, 4 });
                buf.EnqueueAll(new int[] { 5, 6, 7, 8, 9, 10 });
                return(buf);
            }

            {
                var buf = new_test_stream_buf();

                var x = buf.DequeueAll(out _);

                var y = MemoryHelper.SplitMemoryArray(x, 1);
            }

            {
                var buf = new_test_datagram_buf();
                buf.EnqueueAll(new int[] { 11, 12, 13 });

                var a1 = buf.Dequeue(2, out _);
                var a2 = buf.Dequeue(2, out _);
                var a3 = buf.Dequeue(int.MaxValue, out _);
            }

            {
                var buf = new_test_datagram_buf();
                var x1  = new int[88888];
                Array.Fill(x1, 88);
                buf.EnqueueAll(x1);

                var a1 = buf.Dequeue(2, out _);
                buf.Enqueue(31);
                buf.Enqueue(32);
                buf.Enqueue(33);
                var a2 = buf.Dequeue(2, out _);
                buf.Enqueue(34);
                buf.Enqueue(35);
                buf.Enqueue(36);
                var a3 = buf.Dequeue(buf.Length - 6, out _);
                var a4 = buf.Dequeue(4, out _);
                var a5 = buf.Dequeue(2, out _);
            }


            {
                var buf  = new_test_datagram_buf();
                var buf2 = new FastDatagramBuffer <int>();
                var x1   = new int[88888];
                Array.Fill(x1, 88);
                buf.EnqueueAll(x1);

                var a1 = buf.Dequeue(2, out _);
                buf.Enqueue(31);
                buf.Enqueue(32);
                buf.Enqueue(33);
                var a2 = buf.Dequeue(2, out _);
                buf.Enqueue(34);
                buf.Enqueue(35);
                buf.Enqueue(36);
                var a3 = buf.Dequeue(buf.Length - 6, out _);
                var a4 = buf.Dequeue(4, out _);
                var a5 = buf.Dequeue(2, out _);
            }


            {
                var buf1 = new_test_datagram_buf();
                buf1.EnqueueAll(new int[] { 97, 98, 99 });
                buf1.Dequeue(3, out _);

                var buf2 = new_test_datagram_buf();
                buf2.EnqueueAll(new int[] { 87, 88, 89 });
                buf2.Dequeue(3, out _);

                buf2.DequeueAllAndEnqueueToOther(buf1);
            }


            {
                var buf   = new_test_stream_buf();
                var other = new FastStreamBuffer <byte>();
                buf.DequeueAllAndEnqueueToOther(other);
            }

            {
                var buf   = new_test_stream_buf();
                var other = new_test_stream_buf();
                buf.DequeueAllAndEnqueueToOther(other);
            }

            {
                { var buf = new_test_stream_buf(); buf.Insert(0, new byte[] { 21, 22, 23, }, false); }
                { var buf = new_test_stream_buf(); buf.Insert(1, new byte[] { 21, 22, 23, }, false); }
                { var buf = new_test_stream_buf(); buf.Insert(3, new byte[] { 21, 22, 23, }, false); }
                { var buf = new_test_stream_buf(); buf.Insert(4, new byte[] { 21, 22, 23, }, false); }
                { var buf = new_test_stream_buf(); buf.Insert(12, new byte[] { 21, 22, 23, }, false); }
                { var buf = new_test_stream_buf(); buf.Insert(13, new byte[] { 21, 22, 23, }, false); }
                { var buf = new_test_stream_buf(); buf.Insert(17, new byte[] { 21, 22, 23, }, false); }
                { var buf = new_test_stream_buf(); buf.Insert(18, new byte[] { 21, 22, 23, }, false); }
                { var buf = new_test_stream_buf(); buf.Insert(19, new byte[] { 21, 22, 23, }, true); }
                { var buf = new_test_stream_buf(); buf.Insert(-1, new byte[] { 21, 22, 23, }, true); }
            }

            {
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(4, 14 + 100, out long read_size, true); }
            }

            {
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(0, 3, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(1, 1, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(1, 2, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(1, 3, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(1, 6, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(1, 7, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(1, 11, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(1, 12, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(1, 17, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(0, 18, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(4, 14, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(5, 13, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(11, 7, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(12, 6, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(13, 5, out long read_size, false); }
                { var buf = new_test_stream_buf(); var a = buf.GetSegmentsFast(13, 4, out long read_size, false); }
            }

            {
                { var buf = new_test_stream_buf(); buf.PutContiguous(0, 3, false).Span.Fill(88); }
                { var buf = new_test_stream_buf(); buf.PutContiguous(1, 2, false).Span.Fill(88); }
                { var buf = new_test_stream_buf(); buf.PutContiguous(1, 3, false).Span.Fill(88); }
                { var buf = new_test_stream_buf(); buf.PutContiguous(1, 6, false).Span.Fill(88); }
                { var buf = new_test_stream_buf(); buf.PutContiguous(1, 7, false).Span.Fill(88); }
                { var buf = new_test_stream_buf(); buf.PutContiguous(1, 11, false).Span.Fill(88); }
                { var buf = new_test_stream_buf(); buf.PutContiguous(1, 12, false).Span.Fill(88); }
                { var buf = new_test_stream_buf(); buf.PutContiguous(1, 17, false).Span.Fill(88); }
                { var buf = new_test_stream_buf(); buf.PutContiguous(0, 18, false).Span.Fill(88); }

                { var buf = new_test_stream_buf(); buf.PutContiguous(-1, 3, true).Span.Fill(88); }
                { var buf = new_test_stream_buf(); buf.PutContiguous(-1, 7, true).Span.Fill(88); }
                { var buf = new_test_stream_buf(); buf.PutContiguous(11, 10, true).Span.Fill(88); }
                { var buf = new_test_stream_buf(); buf.PutContiguous(-5, 28, true).Span.Fill(88); }
            }

            {
                { var buf = new_test_stream_buf(); var a = buf.DequeueContiguousSlow(2); }
                { var buf = new_test_stream_buf(); var a = buf.DequeueContiguousSlow(3); }
                { var buf = new_test_stream_buf(); var a = buf.DequeueContiguousSlow(4); }
                { var buf = new_test_stream_buf(); var a = buf.DequeueContiguousSlow(11); }
                { var buf = new_test_stream_buf(); var a = buf.DequeueContiguousSlow(12); }
                { var buf = new_test_stream_buf(); var a = buf.DequeueContiguousSlow(13); }
                { var buf = new_test_stream_buf(); var a = buf.DequeueContiguousSlow(17); }
                { var buf = new_test_stream_buf(); var a = buf.DequeueContiguousSlow(18); }
                { var buf = new_test_stream_buf(); var a = buf.DequeueContiguousSlow(19); }
            }

            {
                var buf1 = new_test_stream_buf();
                buf1.Remove(0, 3);

                var buf2 = new_test_stream_buf();
                buf2.Remove(2, 4);

                var buf3 = new_test_stream_buf();
                buf3.Remove(1, 17);

                var buf4 = new_test_stream_buf();
                buf4.Remove(0, 17);

                var buf5 = new_test_stream_buf();
                buf5.Remove(0, 3);

                var buf6 = new_test_stream_buf();
                buf6.Remove(3, 4);

                var buf7 = new_test_stream_buf();
                buf7.Remove(3, 9);

                var buf8 = new_test_stream_buf();
                buf8.Remove(12, 6);

                var buf9 = new_test_stream_buf();
                buf9.Remove(1, 16);

                var buf10 = new_test_stream_buf();
                buf10.Remove(7, 2);

                var buf11 = new_test_stream_buf();
                buf11.Remove(15, 2);
            }
            {
                var buf1 = new_test_stream_buf();
                var r1   = buf1.GetContiguous(buf1.PinHead + 2, 2, false);
                buf1 = new_test_stream_buf();
                var r2 = buf1.GetContiguous(buf1.PinHead + 2, 5, false);
                buf1 = new_test_stream_buf();
                var r3 = buf1.GetContiguous(buf1.PinHead + 2, 6, false);
                buf1 = new_test_stream_buf();
                var r4 = buf1.GetContiguous(buf1.PinHead + 2, 10, false);
                buf1 = new_test_stream_buf();
                var r5 = buf1.GetContiguous(buf1.PinHead + 2, 15, false);
                buf1 = new_test_stream_buf();
                var r6 = buf1.GetContiguous(buf1.PinHead + 2, 16, false);
                buf1 = new_test_stream_buf();
                var r7 = buf1.GetContiguous(buf1.PinHead + 4, 14, false);
            }

            {
                var buf1 = new_test_stream_buf();
                var r1   = buf1.GetContiguous(buf1.PinHead + 0, 3, false);

                buf1 = new_test_stream_buf();
                var r2 = buf1.GetContiguous(buf1.PinHead + 3, 4, false);

                buf1 = new_test_stream_buf();
                var r3 = buf1.GetContiguous(buf1.PinHead + 7, 5, false);

                buf1 = new_test_stream_buf();
                var r4 = buf1.GetContiguous(buf1.PinHead + 12, 6, false);

                buf1 = new_test_stream_buf();
                var r5 = buf1.GetContiguous(buf1.PinHead + 0, 2, false);

                buf1 = new_test_stream_buf();
                var r6 = buf1.GetContiguous(buf1.PinHead + 2, 1, false);

                buf1 = new_test_stream_buf();
                var r7 = buf1.GetContiguous(buf1.PinHead + 3, 1, false);

                buf1 = new_test_stream_buf();
                var r8 = buf1.GetContiguous(buf1.PinHead + 4, 3, false);

                buf1 = new_test_stream_buf();
                var r9 = buf1.GetContiguous(buf1.PinHead + 12, 2, false);

                buf1 = new_test_stream_buf();
                var r10 = buf1.GetContiguous(buf1.PinHead + 14, 4, false);

                buf1 = new_test_stream_buf();
                var r11 = buf1.GetContiguous(buf1.PinHead + 0, 19, true);

                buf1 = new_test_stream_buf();
                var r12 = buf1.GetContiguous(buf1.PinHead + 2, 17, true);

                buf1 = new_test_stream_buf();
                var r13 = buf1.GetContiguous(buf1.PinHead + 11, 8, true);

                buf1 = new_test_stream_buf();
                var r14 = buf1.GetContiguous(buf1.PinHead + 13, 6, true);

                buf1 = new_test_stream_buf();
                var r15 = buf1.GetContiguous(buf1.PinHead + 18, 1, true);
            }
        }
コード例 #6
0
ファイル: Program.cs プロジェクト: dnobori/DNT-Jikken
        static void BenchStreamBuffer()
        {
            FastStreamBuffer <byte> new_test_buf(int num = 1)
            {
                FastStreamBuffer <byte> ret = new FastStreamBuffer <byte>();

                for (int i = 0; i < num; i++)
                {
                    ret.Enqueue(new byte[] { 1, 2, 3, });
                    ret.Enqueue(new byte[] { 4, 5, 6, 7 });
                    ret.Enqueue(new byte[] { 8, 9, 10, 11, 12 });
                    ret.Enqueue(new byte[] { 13, 14, 15, 16, 17, 18 });
                }
                return(ret);
            }

            MicroBenchmarkQueue q = new MicroBenchmarkQueue();

            int num_test_data = 10000;

            object[] test_data_array = new object[num_test_data];
            for (int i = 0; i < num_test_data; i++)
            {
                test_data_array[i] = new object();
            }

            q.Add(new MicroBenchmark <int>("Queue insert test: .NET Queue", 10000,
                                           (x, iterations) =>
            {
                Queue <object> queue = new Queue <object>();

                for (int i = 0; i < iterations; i++)
                {
                    foreach (object o in test_data_array)
                    {
                        queue.Enqueue(o);
                    }
                }
            },
                                           () => 0), true, 0);


            q.Add(new MicroBenchmark <int>("Queue insert test: Fifo<T>", 10000,
                                           (x, iterations) =>
            {
                Fifo <object> fifo = new Fifo <object>();
                var span           = test_data_array.AsSpan();

                for (int i = 0; i < iterations; i++)
                {
                    fifo.Write(span);
                }
            },
                                           () => 0), true, 0);


            q.Add(new MicroBenchmark <int>("InsertFirst", 1000,
                                           (x, iterations) =>
            {
                List <int> rands = new List <int>();
                for (int i = 0; i < 256; i++)
                {
                    rands.Add(WebSocketHelper.RandSInt31());
                }
                Memory <byte> add_data = new byte[] { 1, 2, 3, 4, 5, };

                FastStreamBuffer <byte> buf = new_test_buf();

                for (int i = 0; i < iterations; i++)
                {
                    //buf.Insert(buf.PinHead + 0, add_data);
                    buf.InsertHead(add_data);
                }
            },
                                           () => 0), true, 0);

            q.Add(new MicroBenchmark <int>("InsertAndRemoveRandom", 10000,
                                           (x, iterations) =>
            {
                List <int> rands = new List <int>();
                for (int i = 0; i < 256; i++)
                {
                    rands.Add(WebSocketHelper.RandSInt31());
                }
                Memory <byte> add_data = new byte[] { 1, 2, 3, 4, 5, };

                FastStreamBuffer <byte> buf = new_test_buf();

                for (int i = 0; i < iterations; i++)
                {
                    long pin = buf.PinHead + rands[i % rands.Count] % (buf.Length - add_data.Length);
                    buf.Insert(pin, add_data);
                    buf.Remove(pin, add_data.Length);
                }
            },
                                           () => 0), true, 0);

            q.Add(new MicroBenchmark <int>("EnqueueAndDequeue", 10000,
                                           (x, iterations) =>
            {
                List <int> rands = new List <int>();
                for (int i = 0; i < 256; i++)
                {
                    rands.Add(WebSocketHelper.RandSInt31());
                }
                Memory <byte> add_data = new byte[] { 1, 2, 3, 4, 5, };

                FastStreamBuffer <byte> buf = new_test_buf();

                for (int i = 0; i < iterations; i++)
                {
                    buf.Enqueue(add_data);
                    var ret = buf.Dequeue(long.MaxValue, out _, false);
                }
            },
                                           () => 0), true, 10);

            FastStreamBuffer <byte> bufx1 = new_test_buf(10000);
            FastStreamBuffer <byte> bufx2 = new_test_buf(10000);

            q.Add(new MicroBenchmark <int>("MoveToOtherEmpty", 100000,
                                           (x, iterations) =>
            {
                for (int i = 0; i < iterations; i++)
                {
                    bufx1.DequeueAllAndEnqueueToOther(bufx2);
                    bufx2.DequeueAllAndEnqueueToOther(bufx1);
                }
            },
                                           () => 0), true, 20);

            System.GC.Collect();


            q.Add(new MicroBenchmark <int>("MoveToOtherNonEmpty", 1,
                                           (x, iterations) =>
            {
                FastStreamBuffer <byte> buf1 = new_test_buf(10000);
                FastStreamBuffer <byte> buf2 = new_test_buf(10000);

                for (int i = 0; i < iterations; i++)
                {
                    buf1.DequeueAllAndEnqueueToOther(buf2);
                }
            },
                                           () => 0), true, 20);


            bool call_deque = true;
            long deque_max  = 1;

            q.Add(new MicroBenchmark <int>("Datagram1_single_add", 10000,
                                           (x, iterations) =>
            {
                FastDatagramBuffer <int> dg = new FastDatagramBuffer <int>();

                for (int i = 0; i < iterations; i++)
                {
                    dg.Enqueue(i);
                }

                if (call_deque)
                {
                    for (int i = 0; i < iterations; i++)
                    {
                        var r = dg.Dequeue(deque_max, out long _);
                    }
                }
            },
                                           () => 0), true, 30);



            q.Add(new MicroBenchmark <int>("Datagram1_bulk_add", 10000,
                                           (x, iterations) =>
            {
                FastDatagramBuffer <int> dg = new FastDatagramBuffer <int>();
                int[] tmp = new int[100];

                for (int i = 0; i < iterations; i++)
                {
                    dg.EnqueueAll(tmp);
                }

                if (call_deque)
                {
                    for (int i = 0; i < iterations; i++)
                    {
                        var r = dg.Dequeue(deque_max, out long _);
                    }
                }
            },
                                           () => 0), true, 30);



            q.Run();
        }
コード例 #7
0
    protected override async Task <bool> StreamReadFromObjectImplAsync(FastStreamBuffer fifo, CancellationToken cancel)
    {
        await cancel._WaitUntilCanceledAsync();

        return(true);
    }