Наследование: ManagerBase, IThisLock
Пример #1
0
        public void Decode(ArraySegment <byte>[] pkts, int[] index, int size)
        {
            _cancel = false;

            lock (this.ThisLock)
            {
                ReedSolomon8.Shuffle(pkts, index, _k);

                byte[][] bufs = new byte[pkts.Length][];
                int[]    offs = new int[pkts.Length];

                for (int i = 0; i < bufs.Length; i++)
                {
                    bufs[i] = pkts[i].Array;
                    offs[i] = pkts[i].Offset;
                }

                this.Decode(bufs, offs, index, size);
            }
        }
        public void ReedSolomon8()
        {
            Random random = new Random();

            const int blockSize = 1024 * 1024;

            for (int c = 1; c <= 4; c++)
            {
                ReedSolomon8 pc = new ReedSolomon8(128, 256, c, _bufferManager);

                ArraySegment<byte>[] buffList = new ArraySegment<byte>[128];
                for (int i = 0; i < 128; i++)
                {
                    var buffer = _bufferManager.TakeBuffer(blockSize);
                    random.NextBytes(buffer);

                    buffList[i] = new ArraySegment<byte>(buffer);
                }

                ArraySegment<byte>[] buffList2 = new ArraySegment<byte>[128];
                for (int i = 0; i < 128; i++)
                {
                    var buffer = _bufferManager.TakeBuffer(blockSize);

                    buffList2[i] = new ArraySegment<byte>(buffer);
                }

                int[] intList = new int[128];
                for (int i = 0; i < 128; i++)
                {
                    intList[i] = i + 128;
                }

                Stopwatch sw = new Stopwatch();
                sw.Start();

                pc.Encode(buffList, buffList2, intList, blockSize);
                pc.Decode(buffList2, intList, blockSize);

                sw.Stop();

                for (int i = 0; i < buffList.Length; i++)
                {
                    Assert.IsTrue(CollectionUtilities.Equals(buffList[i].Array, buffList[i].Offset, buffList2[i].Array, buffList2[i].Offset, blockSize), "ReedSolomon");
                }

                for (int i = 0; i < 128; i++)
                {
                    _bufferManager.ReturnBuffer(buffList[i].Array);
                }

                for (int i = 0; i < 128; i++)
                {
                    _bufferManager.ReturnBuffer(buffList2[i].Array);
                }

                Console.WriteLine(string.Format("ReedSolomon8 Parallel {0}: ", c) + sw.Elapsed.ToString());
            }

            Console.Write(Environment.NewLine);
        }
        public void Test_ReedSolomon8()
        {
            for (int count = 128 - 1; count >= 0; count--)
            {
                int blockLength = _random.Next(32, 1024);

                ReedSolomon8 reedSolomon8 = new ReedSolomon8(128, 256, 2, _bufferManager);

                var buffList = new ArraySegment<byte>[128];
                for (int i = 0; i < 128; i++)
                {
                    var buffer = new byte[blockLength];
                    _random.NextBytes(buffer);

                    buffList[i] = new ArraySegment<byte>(buffer, 0, buffer.Length);
                }

                var buffList2 = new ArraySegment<byte>[256];
                for (int i = 0; i < 256; i++)
                {
                    var buffer = new byte[blockLength];

                    buffList2[i] = new ArraySegment<byte>(buffer, 0, buffer.Length);
                }

                var intList = new int[256];
                for (int i = 0; i < 256; i++)
                {
                    intList[i] = i;
                }

                reedSolomon8.Encode(buffList, buffList2, intList, blockLength);

                var buffList3 = new ArraySegment<byte>[128];
                {
                    int i = 0;

                    for (int j = 0; i < 64; i++, j++)
                    {
                        buffList3[i] = buffList2[i];
                    }
                    for (int j = 0; i < 128; i++, j++)
                    {
                        buffList3[i] = buffList2[128 + j];
                    }
                }

                var intList2 = new int[128];
                {
                    int i = 0;

                    for (int j = 0; i < 64; i++, j++)
                    {
                        intList2[i] = i;
                    }
                    for (int j = 0; i < 128; i++, j++)
                    {
                        intList2[i] = 128 + j;
                    }
                }

                {
                    int n = buffList3.Length;

                    while (n > 1)
                    {
                        int k = _random.Next(n--);

                        var temp = buffList3[n];
                        buffList3[n] = buffList3[k];
                        buffList3[k] = temp;

                        var temp2 = intList2[n];
                        intList2[n] = intList2[k];
                        intList2[k] = temp2;
                    }
                }

                reedSolomon8.Decode(buffList3, intList2, blockLength);

                for (int i = 0; i < buffList.Length; i++)
                {
                    Assert.IsTrue(CollectionUtils.Equals(buffList[i].Array, buffList[i].Offset, buffList3[i].Array, buffList3[i].Offset, blockLength), "ReedSolomon");
                }
            }

            {
                ReedSolomon8 reedSolomon8 = new ReedSolomon8(128, 256, 4, _bufferManager);

                var buffList = new ArraySegment<byte>[128];
                for (int i = 0; i < 128; i++)
                {
                    var buffer = new byte[1024 * 32];
                    _random.NextBytes(buffer);

                    buffList[i] = new ArraySegment<byte>(buffer, 0, buffer.Length);
                }

                var buffList2 = new ArraySegment<byte>[128];
                for (int i = 0; i < 128; i++)
                {
                    var buffer = new byte[1024 * 32];

                    buffList2[i] = new ArraySegment<byte>(buffer, 0, buffer.Length);
                }

                var intList = new int[128];
                for (int i = 0; i < 128; i++)
                {
                    intList[i] = i + 128;
                }

                {
                    Stopwatch sw = new Stopwatch();
                    sw.Start();

                    var task1 = Task.Run(() =>
                    {
                        reedSolomon8.Encode(buffList, buffList2, intList, 1024 * 32);
                    });

                    Thread.Sleep(1000 * 1);

                    var task2 = Task.Run(() =>
                    {
                        reedSolomon8.Cancel();
                    });

                    Task.WaitAll(task1, task2);

                    sw.Stop();

                    Assert.IsTrue(sw.Elapsed.TotalSeconds < 3);
                }
            }

            {
                ReedSolomon8 pc = new ReedSolomon8(128, 256, 4, _bufferManager);

                var buffList = new ArraySegment<byte>[128];
                for (int i = 0; i < 128; i++)
                {
                    var buffer = new byte[1024 * 32];
                    _random.NextBytes(buffer);

                    buffList[i] = new ArraySegment<byte>(buffer, 0, buffer.Length);
                }

                var buffList2 = new ArraySegment<byte>[128];
                for (int i = 0; i < 128; i++)
                {
                    var buffer = new byte[1024 * 32];

                    buffList2[i] = new ArraySegment<byte>(buffer, 0, buffer.Length);
                }

                var intList = new int[128];
                for (int i = 0; i < 128; i++)
                {
                    intList[i] = i + 128;
                }

                pc.Encode(buffList, buffList2, intList, 1024 * 32);

                {
                    Stopwatch sw = new Stopwatch();
                    sw.Start();

                    var task1 = Task.Run(() =>
                    {
                        pc.Decode(buffList2.ToArray(), intList, 1024 * 32);
                    });

                    Thread.Sleep(1000 * 1);

                    var task2 = Task.Run(() =>
                    {
                        pc.Cancel();
                    });

                    Task.WaitAll(task1, task2);

                    sw.Stop();

                    Assert.IsTrue(sw.Elapsed.TotalSeconds < 3);
                }
            }
        }