lith 4 years ago
parent
commit
273e2ae35d
24 changed files with 233 additions and 117 deletions
  1. 2 2
      dotnet/Library/Sers/Sers.CL/Test/CommunicationManage/Client/ProgramQps.cs
  2. 32 26
      dotnet/Library/Sers/Sers.CL/Test/MessageDelivery/DeliveryClient/Program.cs
  3. 25 0
      dotnet/Library/Sers/Sers.CL/Test/MessageDelivery/DeliveryClient/README.md
  4. 2 1
      dotnet/Library/Sers/Sers.CL/Test/MessageDelivery/DeliveryClient/StartConsole.bat
  5. 13 9
      dotnet/Library/Sers/Sers.CL/Test/MessageDelivery/DeliveryServer/Program.cs
  6. 1 1
      dotnet/Library/Sers/Sers.Core/Sers.Core/CL/MessageOrganize/DefaultOrganize/OrganizeClient.cs
  7. 4 4
      dotnet/Library/Sers/Sers.Core/Sers.Core/CL/MessageOrganize/DefaultOrganize/RequestAdaptor.cs
  8. 1 1
      dotnet/Library/Sers/Sers.Core/Sers.Core/Module/Api/ApiClient.cs
  9. 5 8
      dotnet/Library/Sers/Sers.Core/Sers.Core/Module/Message/SersFile.cs
  10. 1 1
      dotnet/Library/Sers/Sers.Core/Sers.Core/Module/PubSub/MessageCenterService.cs
  11. 3 3
      dotnet/Library/Sers/Sers.Core/Sers.Core/Module/PubSub/MessageClient.cs
  12. 1 1
      dotnet/Library/Sers/Sers.ServiceStation/Sers.ServiceStation/ServiceStation.cs
  13. 4 9
      dotnet/Library/Vit/Vit.Core/Vit.Core/Extensions/byte/ArraySegmentByteExtensions.cs
  14. 3 12
      dotnet/Library/Vit/Vit.Core/Vit.Core/Extensions/byte/ByteDataExtensions.cs
  15. 29 4
      dotnet/Library/Vit/Vit.Core/Vit.Core/Extensions/byte/DataCopyExtensions.cs
  16. 21 11
      dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pipelines/ByteData.cs
  17. 2 2
      dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pipelines/PipeFrame.cs
  18. 11 4
      dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pool/DataPool.cs
  19. 12 7
      dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pool/ObjectPool.cs
  20. 22 6
      dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pool/ObjectPoolByGenerator.cs
  21. 36 2
      dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pool/PoolCache.cs
  22. 1 1
      dotnet/ServiceCenter/Sers.ServiceCenter/Sers.Gover/Base/GoverManage.cs
  23. 1 1
      dotnet/ServiceCenter/Sers.ServiceCenter/Sers.ServiceCenter/Entity/ServiceStation.cs
  24. 1 1
      dotnet/ServiceCenter/Sers.ServiceCenter/Sers.ServiceCenter/ServiceCenter.cs

+ 2 - 2
dotnet/Library/Sers/Sers.CL/Test/CommunicationManage/Client/ProgramQps.cs

@@ -78,7 +78,7 @@ namespace CLClient
 
             for (int i = Vit.Core.Util.ConfigurationManager.ConfigurationManager.Instance.GetByPath<int>("PressureTest.messageThreadCount"); i > 0; i--)
             {
-                cm.SendMessageAsync(new ByteData(buff.BytesToByteData()));
+                cm.SendMessageAsync(new ByteData(buff));
             }
 
             int theadCount = Vit.Core.Util.ConfigurationManager.ConfigurationManager.Instance.GetByPath<int>("PressureTest.requestThreadCount");
@@ -97,7 +97,7 @@ namespace CLClient
 
                 for (int t= theadCount;t>0 ;t-- )
                 {
-                    callback(null, new ByteData(buff.BytesToByteData()));
+                    callback(null, new ByteData(buff));
                 }
 
 

+ 32 - 26
dotnet/Library/Sers/Sers.CL/Test/MessageDelivery/DeliveryClient/Program.cs

@@ -70,8 +70,8 @@ namespace DeliveryTest
         static string host = "127.0.0.1";
         static int port = 4501;
 
-        static int thread = 16;
-        static int msgLen = 1024;
+        static int thread = 200;
+        static int msgLen = 1;
 
 
 
@@ -79,28 +79,34 @@ namespace DeliveryTest
 
         static void StartClient()
         {
-            var client = new Sers.CL.Socket.Iocp.DeliveryClient();
-            client.host = host;
-            client.port = port;
+            //var client = new Sers.CL.Socket.Iocp.DeliveryClient();
+            //client.host = host;
+            //client.port = port;
 
             //var client = new Sers.CL.WebSocket.DeliveryClient();
             //var client = new Sers.CL.ClrZmq.ThreadWait.DeliveryClient();
             //var client = new Sers.CL.Ipc.SharedMemory.DeliveryClient();
             //var client = new Sers.CL.Zmq.FullDuplex.DeliveryClient();
-            //var client = new Sers.CL.Ipc.NamedPipe.DeliveryClient();
+            var client = new Sers.CL.Ipc.NamedPipe.DeliveryClient();
 
             client.Conn_OnGetFrame = (conn, data) =>
-            {
+           {
+               Task.Run(() =>
+               {
+                   qpsInfo.IncrementRequest();
+
+                   //data[0]++;
 
-                qpsInfo.IncrementRequest();
+                   //data[1] = 10;
+                   Thread.Sleep(1);
+                   //SpinWait sw = new SpinWait();
+                   //sw.SpinOnce();
 
-                //data[0]++;
+                    var byteData = new Vit.Core.Util.Pipelines.ByteData(data);
+                   conn.SendFrameAsync(byteData);
+               });
 
-                //data[1] = 10;
-                var byteData = new Vit.Core.Util.Pipelines.ByteData(data);
-                conn.SendFrameAsync(byteData);
-           
-            };
+           };
 
             var connected = client.Connect();
 
@@ -111,19 +117,19 @@ namespace DeliveryTest
 
             for (var t = 0; t < thread; t++)
             {
-                //client.conn.SendFrameAsync(new Vit.Core.Util.Pipelines.ByteData() { new ArraySegment<byte>(buff)});
-                Task.Run(()=> {
-
-                    while (true)
-                    {
-                        for (int t1 = 0; t1 < 1000; t1++)
-                        {
-                            client.conn.SendFrameAsync(new Vit.Core.Util.Pipelines.ByteData( new ArraySegment<byte>(buff)));
-                        }
-                        //Thread.Sleep(1);
-                    }
+                client.conn.SendFrameAsync(new Vit.Core.Util.Pipelines.ByteData(new ArraySegment<byte>(buff))  );
+                //Task.Run(()=> {
+
+                //    while (true)
+                //    {
+                //        for (int t1 = 0; t1 < 100; t1++)
+                //        {
+                //            client.conn.SendFrameAsync(new Vit.Core.Util.Pipelines.ByteData( new ArraySegment<byte>(buff)));
+                //        }
+                //        Thread.Sleep(1);
+                //    }
                 
-                });
+                //});
             }
 
         }

+ 25 - 0
dotnet/Library/Sers/Sers.CL/Test/MessageDelivery/DeliveryClient/README.md

@@ -1,4 +1,29 @@
 
+
+#--------------------------------
+ 
+dotnet DeliveryClient.dll 192.168.10.11 4501 200 1
+
+qpsΪ 7.3Íò
+cpu  92%
+
+
+
+
+
+
+cpu  87%
+
+
+
+
+
+
+
+
+
+
+
 #--------------------------------
 Æô¶¯20¸ö½ø³Ì
 dotnet DeliveryClient.dll 192.168.10.11 4501 300 102 > console.log 2>&1 &

+ 2 - 1
dotnet/Library/Sers/Sers.CL/Test/MessageDelivery/DeliveryClient/StartConsole.bat

@@ -4,7 +4,8 @@
 
 :: dotnet DeliveryClient/DeliveryClient.dll 127.0.0.1 4501 200 1024
 
-dotnet DeliveryClient.dll 127.0.0.1 4501 200 1
+:: dotnet DeliveryClient.dll 127.0.0.1 4501 200 1
+dotnet DeliveryClient.dll
 pause
 
 

+ 13 - 9
dotnet/Library/Sers/Sers.CL/Test/MessageDelivery/DeliveryServer/Program.cs

@@ -2,6 +2,7 @@
 using System;
 using System.Collections.Generic;
 using System.Threading;
+using System.Threading.Tasks;
 using Vit.Core.Module.Log;
 
 namespace DeliveryTest
@@ -43,14 +44,14 @@ namespace DeliveryTest
 
         static void StartServer()
         {
-            var server = new Sers.CL.Socket.Iocp.DeliveryServer();
-            server.port = port;
+            //var server = new Sers.CL.Socket.Iocp.DeliveryServer();
+            //server.port = port;
 
             //var server = new Sers.CL.WebSocket.DeliveryServer();
             //var server = new Sers.CL.ClrZmq.ThreadWait.DeliveryServer();
             //var server = new Sers.CL.Ipc.SharedMemory.DeliveryServer();
             //var server = new Sers.CL.Zmq.FullDuplex.DeliveryServer();
-            //var server = new Sers.CL.Ipc.NamedPipe.DeliveryServer();
+            var server = new Sers.CL.Ipc.NamedPipe.DeliveryServer();
 
             server.Conn_OnConnected = (conn) =>
             {
@@ -58,14 +59,17 @@ namespace DeliveryTest
 
                 conn.OnGetFrame = (conn_, data) =>
                 {
-                    qpsInfo.IncrementRequest();
-        
+                    //Task.Run(() =>
+                    //{
+                        qpsInfo.IncrementRequest();
 
-                    //data[0]++;
-                    //data[1] = 5;
-                    //var byteData = new Vit.Core.Util.Pipelines.ByteData() { data };
 
-                    //conn_.SendFrameAsync(byteData);
+                        //data[0]++;
+                        //data[1] = 5;
+                        var byteData = new Vit.Core.Util.Pipelines.ByteData(data);
+
+                        conn_.SendFrameAsync(byteData);
+                    //});
                 };
             };
 

+ 1 - 1
dotnet/Library/Sers/Sers.Core/Sers.Core/CL/MessageOrganize/DefaultOrganize/OrganizeClient.cs

@@ -140,7 +140,7 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
 
         private bool CheckSecretKey()
         {
-            var requestData = new ByteData(secretKey.SerializeToBytes().BytesToByteData());
+            var requestData = new ByteData(secretKey.SerializeToBytes());
 
             //发送身份验证
             Logger.Info("[CL.OrganizeClient] Authentication - sending SecretKey...");

+ 4 - 4
dotnet/Library/Sers/Sers.Core/Sers.Core/CL/MessageOrganize/DefaultOrganize/RequestAdaptor.cs

@@ -548,7 +548,7 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
 
 
         static readonly byte[] organizeVersion_ba = organizeVersion.SerializeToBytes();
-        static Vit.Core.Util.Pipelines.ByteData HeartBeat_Data => new ByteData(organizeVersion_ba.BytesToByteData());
+        static Vit.Core.Util.Pipelines.ByteData HeartBeat_Data => new ByteData(organizeVersion_ba);
 
         class HeartBeatInfo
         {
@@ -690,7 +690,7 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
         static void PackageReqRepFrame(long reqKey, Vit.Core.Util.Pipelines.ByteData oriMsg, out Vit.Core.Util.Pipelines.ByteData reqRepFrame)
         {
             //*
-            reqRepFrame = new ByteData(DataPool.ByteDataGet());
+            reqRepFrame = new ByteData();
 
             //第1帧 reqKey
             reqRepFrame.Add(reqKey.Int64ToBytes().BytesToArraySegmentByte());
@@ -699,14 +699,14 @@ namespace Sers.Core.CL.MessageOrganize.DefaultOrganize
             if (null != oriMsg) reqRepFrame.AddRange(oriMsg);
 
             /*/
-            reqRepFrame = oriMsg ?? DataPool.ByteDataGet();
+            reqRepFrame = oriMsg ?? new ByteData();
 
             //reqKey
             reqRepFrame.Insert(0, reqKey.Int64ToBytes().BytesToArraySegmentByte());
             //*/
         }
 
-     
+
         #endregion
 
 

+ 1 - 1
dotnet/Library/Sers/Sers.Core/Sers.Core/Module/Api/ApiClient.cs

@@ -66,7 +66,7 @@ namespace Sers.Core.Module.Api
         {
             try
             {
-                var reply = CallApi(new ByteData(request.Package()));
+                var reply = CallApi(request.Package());
                 if (null == reply || reply.Count == 0)
                 {
                     //Logger.Error(SsError.Err_Timeout.ToException());

+ 5 - 8
dotnet/Library/Sers/Sers.Core/Sers.Core/Module/Message/SersFile.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Runtime.CompilerServices;
+using Vit.Core.Util.Pipelines;
 using Vit.Extensions;
 
 namespace Sers.Core.Module.Message
@@ -31,16 +32,12 @@ namespace Sers.Core.Module.Message
 
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public List<ArraySegment<byte>> Package()
+        public ByteData Package()
         {
             return PackageArraySegmentByte(Files);
         }
 
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public byte[] PackageToBytes()
-        {
-            return Package().ByteDataToBytes();
-        }
+         
         #endregion
 
 
@@ -95,9 +92,9 @@ namespace Sers.Core.Module.Message
         /// <param name="files"></param>
         /// <returns></returns>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        static List<ArraySegment<byte>> PackageArraySegmentByte(List<ArraySegment<byte>> files)
+        static ByteData PackageArraySegmentByte(List<ArraySegment<byte>> files)
         {
-            var oriData = new List<ArraySegment<byte>>();
+            var oriData = new ByteData();
 
             foreach (var file in files)
             {

+ 1 - 1
dotnet/Library/Sers/Sers.Core/Sers.Core/Module/PubSub/MessageCenterService.cs

@@ -74,7 +74,7 @@ namespace Sers.Core.Module.PubSub
                 (new[] { (byte)EFrameType.message }).BytesToArraySegmentByte(),
                  msgTitle.SerializeToArraySegmentByte(),
                  msgData
-                ).PackageToBytes();
+                ).Package().ToBytes();
         
             foreach (var conn in connList.Values)
             {

+ 3 - 3
dotnet/Library/Sers/Sers.Core/Sers.Core/Module/PubSub/MessageClient.cs

@@ -100,7 +100,7 @@ namespace Sers.Core.Module.PubSub
                  msgTitle.SerializeToArraySegmentByte(),
                  msgData
                 ).Package();
-            SendFrame(new ByteData(frame));
+            SendFrame(frame);
         }
 
         public void Message_Subscribe(string msgTitle)
@@ -110,7 +110,7 @@ namespace Sers.Core.Module.PubSub
                 new[] { (byte)EFrameType.subscribe }.BytesToArraySegmentByte(),
                  msgTitle.SerializeToArraySegmentByte()
                 ).Package();
-            SendFrame(new ByteData(frame));
+            SendFrame(frame);
         }
 
         public void Message_SubscribeCancel(string msgTitle)
@@ -120,7 +120,7 @@ namespace Sers.Core.Module.PubSub
                 new[] { (byte)EFrameType.subscribeCancel }.BytesToArraySegmentByte(),
                  msgTitle.SerializeToArraySegmentByte()
                 ).Package();
-            SendFrame(new ByteData(frame));
+            SendFrame(frame);
         }
 
 

+ 1 - 1
dotnet/Library/Sers/Sers.ServiceStation/Sers.ServiceStation/ServiceStation.cs

@@ -234,7 +234,7 @@ namespace Sers.ServiceStation
             {
                 localApiService.CallApiAsync(sender, new ApiMessage(requestData), (object sender1, ApiMessage apiReplyMessage) =>
                 {
-                     callback(sender1, new ByteData(apiReplyMessage.Package()));
+                     callback(sender1, apiReplyMessage.Package());
                 });
             };
 

+ 4 - 9
dotnet/Library/Vit/Vit.Core/Vit.Core/Extensions/byte/ArraySegmentByteExtensions.cs

@@ -23,7 +23,8 @@ namespace Vit.Extensions
         public static ArraySegment<T> Slice<T>(this ArraySegment<T> seg,int Offset,int? count=null)
         {
             return new ArraySegment<T>(seg.Array,seg.Offset+ Offset, count?? (seg.Count-Offset) );
-        }
+        } 
+
 
 
 
@@ -56,14 +57,8 @@ namespace Vit.Extensions
 
             var bytes = new byte[data.Count];
             if (data.Count > 0)
-            {              
-                unsafe
-                {
-                    fixed (byte* pSource = data.Array, pTarget = bytes)
-                    {
-                        Buffer.MemoryCopy(pSource + data.Offset, pTarget, data.Count, data.Count);
-                    }
-                }
+            {
+                data.CopyTo(bytes);                
             }
             return bytes;
         }

+ 3 - 12
dotnet/Library/Vit/Vit.Core/Vit.Core/Extensions/byte/ByteDataExtensions.cs

@@ -23,18 +23,9 @@ namespace Vit.Extensions
             int curIndex = 0;
             foreach (var item in byteData)
             {
-                if (null == item.Array || item.Count == 0) continue;
-
-                //item.CopyTo(bytes, curIndex);
-                //Buffer.BlockCopy(item.Array, item.Offset, bytes, curIndex, item.Count);
-
-                unsafe
-                {
-                    fixed (byte* pSource = item.Array, pTarget = bytes)
-                    {
-                        Buffer.MemoryCopy(pSource + item.Offset, pTarget + curIndex, item.Count, item.Count);
-                    }
-                }
+                if (null == item.Array || item.Count == 0) continue; 
+
+                item.CopyTo(bytes, curIndex);                
 
                 curIndex += item.Count;
             }

+ 29 - 4
dotnet/Library/Vit/Vit.Core/Vit.Core/Extensions/byte/DataCopyExtensions.cs

@@ -1,14 +1,39 @@
-using Vit.Core.Module.Serialization;
-using System;
+using System;
+using System.Runtime.CompilerServices;
 
 namespace Vit.Extensions
 {
     public static partial class DataCopyExtensions
     {
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static void CopyTo(this ArraySegment<byte> source, byte[] dest, int destOffset=0, int? count = null)
+        {
+            unsafe
+            {
+                fixed (byte* pSource = source.Array, pTarget = dest)
+                {
+                    Buffer.MemoryCopy(pSource + source.Offset, pTarget + destOffset, count ?? source.Count, count ?? source.Count);
+                }
+            }
+        }
+
+
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static void CopyTo(this byte[] source, int sourceOffset, int count, byte[] dest, int destOffset=0)
+        {
+            unsafe
+            {
+                fixed (byte* pSource = source, pTarget = dest)
+                {
+                    Buffer.MemoryCopy(pSource + sourceOffset, pTarget + destOffset, count, count);
+                }
+            }
+        }
+
+
 
- 
-        internal static void CopyTo<T>(this ArraySegment<T> seg, T[] bytes, int curIndex = 0)
+        private static void CopyTo<T>(this ArraySegment<T> seg, T[] bytes, int curIndex = 0)
         {
             //Array.Copy(seg.Array, seg.Offset, bytes, curIndex, seg.Count);
             Buffer.BlockCopy(seg.Array, seg.Offset, bytes, curIndex, seg.Count);

+ 21 - 11
dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pipelines/ByteData.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Runtime.CompilerServices;
+using Vit.Core.Util.Pool;
 using Vit.Extensions;
 
 namespace Vit.Core.Util.Pipelines
@@ -27,26 +28,36 @@ namespace Vit.Core.Util.Pipelines
 
         public readonly List<ArraySegment<byte>> byteData;
 
+        //~ByteData()
+        //{
+        //    //byteData.Clear();      
+        //    //ObjectPool<List<ArraySegment<byte>>>.Shared.Push(byteData);
+        //}
+
+
         public ByteData()
         {
             byteData = new List<ArraySegment<byte>>();
+            //byteData = ObjectPool<List<ArraySegment<byte>>>.Shared.Pop();
         }
 
-        public ByteData(int capacity)
-        {
-            byteData = new List<ArraySegment<byte>>(capacity);
-        }
+        //public ByteData(int capacity)
+        //{
+        //    byteData = new List<ArraySegment<byte>>(capacity);
+        //}
 
         public ByteData(ArraySegment<byte> data):this()
         {
             byteData.Add(data);
         }
 
-
-        public ByteData(List<ArraySegment<byte>> byteData)
-        {
-            this.byteData = byteData;
+        public ByteData(byte[] bytes):this(bytes.BytesToArraySegmentByte())
+        {     
         }
+        //public ByteData(List<ArraySegment<byte>> byteData)
+        //{
+        //    this.byteData = byteData;
+        //}
 
 
         #region implicit
@@ -105,7 +116,7 @@ namespace Vit.Core.Util.Pipelines
 
 
 
-        #region []
+        #region //[]
         //public ArraySegment<byte> this[int index]
         //{
         //    get
@@ -122,7 +133,7 @@ namespace Vit.Core.Util.Pipelines
 
 
 
-        #region IEnumerable
+        #region //IEnumerable
 
         //[MethodImpl(MethodImplOptions.AggressiveInlining)]
         //public IEnumerator<ArraySegment<byte>> GetEnumerator()
@@ -145,7 +156,6 @@ namespace Vit.Core.Util.Pipelines
 
 
 
-
         #region Count
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]

+ 2 - 2
dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pipelines/PipeFrame.cs

@@ -65,7 +65,7 @@ namespace Vit.Core.Util.Pipelines
                 if (cur.Count <= leftCount)
                 {
                     //dataToPop 数据长
-                    Array.Copy(cur.Array, cur.Offset, dataToPop, copyedIndex + offset_dataToPop, cur.Count);
+                    cur.CopyTo(dataToPop, copyedIndex + offset_dataToPop);     
                     copyedIndex += cur.Count;
                     QueueBuff_dataLenOfRemoved = 0;
 
@@ -75,7 +75,7 @@ namespace Vit.Core.Util.Pipelines
                 else
                 {
                     //queueBuff 数据长
-                    Array.Copy(cur.Array, cur.Offset, dataToPop, copyedIndex + offset_dataToPop, leftCount);
+                    cur.CopyTo(dataToPop, copyedIndex + offset_dataToPop, leftCount);      
                     copyedIndex += leftCount;
                     QueueBuff_dataLenOfRemoved += leftCount;
                 }

+ 11 - 4
dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pool/DataPool.cs

@@ -1,20 +1,23 @@
 using System;
 using System.Buffers;
 using System.Collections.Generic;
+using System.Runtime.CompilerServices;
 
 namespace Vit.Core.Util.Pool
 {
     public class DataPool
     {
-       
-      
+
+
         #region Bytes       
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static byte[] BytesGet(int minimumLength)
         {
             // return new byte[minimumLength];
             return ArrayPool<byte>.Shared.Rent(minimumLength);
         }
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static void BytesReturn(byte[] data)
         {
              ArrayPool<byte>.Shared.Return(data);
@@ -22,13 +25,15 @@ namespace Vit.Core.Util.Pool
         #endregion
 
         #region ArraySegmentByte       
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static ArraySegment<byte> ArraySegmentByteGet(int length)
         {
             return new ArraySegment<byte>(BytesGet(length), 0, length);           
         }
 
+        //[MethodImpl(MethodImplOptions.AggressiveInlining)]
         //public static void ArraySegmentByteReturn(ArraySegment<byte> data)
-        //{            
+        //{
         //    BytesReturn(data.Array);
         //}
         #endregion
@@ -36,13 +41,15 @@ namespace Vit.Core.Util.Pool
 
 
         #region ByteData
- 
+
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static List<System.ArraySegment<byte>> ByteDataGet()
         {
             //return new List<System.ArraySegment<byte>>();
             return ObjectPool<List<System.ArraySegment<byte>>>.Shared.Pop();
         }
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         internal static void ByteDataReturn(List<System.ArraySegment<byte>> data)
         {
             //return;

+ 12 - 7
dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pool/ObjectPool.cs

@@ -1,4 +1,6 @@
- 
+
+using System.Runtime.CompilerServices;
+
 namespace Vit.Core.Util.Pool
 {
     public class ObjectPool<T>
@@ -14,20 +16,23 @@ namespace Vit.Core.Util.Pool
         /// <summary>
         /// Gets or sets the total number of elements the internal data structure can hold without resizing.(default:100000)
         /// </summary>
-        public int Capacity = 100000;
-        
+        public int Capacity = 2<<16;
+
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public T Pop()
         {
             //return new T();
             return _objects.TryTake(out var item) ? item : new T();
         }
 
-        public T PopOrNull()
-        {
-            return _objects.TryTake(out var item) ? item : null;
-        }
+        //[MethodImpl(MethodImplOptions.AggressiveInlining)]
+        //public T PopOrNull()
+        //{
+        //    return _objects.TryTake(out var item) ? item : null;
+        //}
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public void Push(T item)
         {
             if (_objects.Count > Capacity) return;

+ 22 - 6
dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pool/ObjectPoolByGenerator.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Runtime.CompilerServices;
 
 namespace Vit.Core.Util.Pool
 {
@@ -11,25 +12,40 @@ namespace Vit.Core.Util.Pool
 
         public Func<T> objectGenerator;
 
+
+
+        /// <summary>
+        /// Gets or sets the total number of elements the internal data structure can hold without resizing.(default:100000)
+        /// </summary>
+        public int Capacity = 2 << 16;
+
+
         public ObjectPoolGenerator(Func<T> objectGenerator=null)
         {
             this.objectGenerator = objectGenerator;
             //this.objectGenerator = objectGenerator ?? throw new ArgumentNullException("objectGenerator");          
         }
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public T Pop()
         {
+            //return objectGenerator.Invoke();
+
             if (_objects.TryTake(out var item)) return item;
             if(objectGenerator!=null) return objectGenerator.Invoke();
-            return default(T);
-        }
-        public T PopOrNull()
-        {
-            return _objects.TryTake(out var item) ? item : default(T);
+            return default;
         }
 
+        //[MethodImpl(MethodImplOptions.AggressiveInlining)]
+        //public T PopOrNull()
+        //{
+        //    return _objects.TryTake(out var item) ? item : default(T);
+        //}
+
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public void Push(T item)
-        { 
+        {
+            if (_objects.Count > Capacity) return;
             _objects.Add(item);
         }
     }

+ 36 - 2
dotnet/Library/Vit/Vit.Core/Vit.Core/Util/Pool/PoolCache.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
+using System.Runtime.CompilerServices;
 using System.Text;
 
 namespace Vit.Core.Util.Pool
@@ -9,17 +10,19 @@ namespace Vit.Core.Util.Pool
     {
 
         #region 使用队列 ConcurrentQueue       
-        ///*
+        /*
         ConcurrentQueue<T> queue = new ConcurrentQueue<T>();
 
 
         public int Count => queue.Count;
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public bool TryTake(out T result) 
         {
             return queue.TryDequeue(out result);
         }
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public void Add(T item) 
         {
             queue.Enqueue(item);
@@ -29,17 +32,19 @@ namespace Vit.Core.Util.Pool
 
 
         #region 使用队列 ConcurrentBag       
-        /*
+        ///*
         ConcurrentBag<T> queue = new ConcurrentBag<T>();
 
 
         public int Count => queue.Count;
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public bool TryTake(out T result) 
         {
             return queue.TryTake(out result);
         }
 
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public void Add(T item) 
         {
             queue.Add(item);
@@ -48,6 +53,35 @@ namespace Vit.Core.Util.Pool
         #endregion
 
 
+        #region 使用 RingBuffer
+        /*
+
+        const int power = 16;
+
+        T[] queue = new T[2<< power];
+
+        int head = 0;
+        int tail = 0;
+
+        int count = 0;
+
+        //public int Count => queue.Count;
+
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public bool TryTake(out T result)
+        {
+
+
+            return queue.TryTake(out result);
+        }
+
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public void Add(T item)
+        {
+            queue.Add(item);
+        }
+        //*/
+        #endregion
 
 
 

+ 1 - 1
dotnet/ServiceCenter/Sers.ServiceCenter/Sers.Gover/Base/GoverManage.cs

@@ -234,7 +234,7 @@ namespace Sers.Gover.Base
             void SendReply(SsError error)
             {
                 //callback(sender, new ApiMessage().InitByError(error).SetSysErrToRpcData(error).Package().ByteDataToBytes().BytesToArraySegmentByte());
-                callback(sender, new ByteData(new ApiMessage().InitAsApiReplyMessageByError(error).Package()));
+                callback(sender, new ApiMessage().InitAsApiReplyMessageByError(error).Package());
             }
 
           

+ 1 - 1
dotnet/ServiceCenter/Sers.ServiceCenter/Sers.ServiceCenter/Entity/ServiceStation.cs

@@ -100,7 +100,7 @@ namespace Sers.ServiceCenter.Entity
      
         public void SendRequestAsync(Object sender, ApiMessage apiReqMessage, Action<object, Vit.Core.Util.Pipelines.ByteData> callback)
         {
-            connection.SendRequestAsync(sender, new ByteData(apiReqMessage.Package()), callback);            
+            connection.SendRequestAsync(sender,apiReqMessage.Package(), callback);            
         }
     }
 }

+ 1 - 1
dotnet/ServiceCenter/Sers.ServiceCenter/Sers.ServiceCenter/ServiceCenter.cs

@@ -102,7 +102,7 @@ namespace Sers.ServiceCenter
             {
                 localApiService.CallApiAsync(sender, new ApiMessage(requestData.ToArraySegment()), (sender_, apiReplyMessage) =>
                 {
-                    callback(sender_, new ByteData(apiReplyMessage.Package()));
+                    callback(sender_,apiReplyMessage.Package());
                 });
             }
             public bool SendRequest(Vit.Core.Util.Pipelines.ByteData requestData, out Vit.Core.Util.Pipelines.ByteData replyData)