lith 4 năm trước cách đây
mục cha
commit
052a09b267

+ 87 - 0
dotnet/Library/Vit/Vit.Core/Test/Vit.Core.Module.Serialization.Qps/Program.cs

@@ -0,0 +1,87 @@
+using Sers.Core.Module.Rpc;
+using Statistics;
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace App
+{
+    class Program
+    {
+        public static int workThreadCount = 4;
+
+
+        static void Main(string[] args)
+        {
+
+            if (args != null)
+            {
+                if (args.Length >= 1)
+                {
+                    int.TryParse(args[0], out workThreadCount);
+                }
+            }
+            statisticsQps.Start("Msg");
+
+            for (var t = 0; t < workThreadCount; t++)
+            {
+                StartThread();
+            }
+
+            while (true)
+            {
+                Thread.Sleep(5000);
+            }
+        }
+
+
+
+
+        static StatisticsQpsAsync statisticsQps = new StatisticsQpsAsync();
+  
+   
+
+
+        public static void StartThread()
+        {
+            QpsData qpsInfo = new QpsData(statisticsQps);
+            Task.Run(() =>
+            {
+                // 4线程 71万
+                // var Instance = Vit.Core.Module.Serialization.Serialization_Newtonsoft.Instance;
+
+
+                // 4线程 87万
+                var Instance = Vit.Core.Module.Serialization.Serialization_Text.Instance;
+
+                while (true)
+                {
+                    try
+                    {
+                        for (var t = 0; t < 10000; t++)
+                        {
+                            var data = new RpcContextData { route = "/a" };
+
+                            //var str = Instance.SerializeToString(data);
+
+                            var bytes = Instance.SerializeToBytes(data);
+
+                            var data2 = Instance.DeserializeFromBytes<RpcContextData>(bytes);
+                        }
+
+                        qpsInfo.RequestCount++;
+                    }
+                    catch (Exception ex)
+                    {
+                    }
+                }
+
+            });
+
+        }
+         
+
+
+
+    }
+}

+ 15 - 0
dotnet/Library/Vit/Vit.Core/Test/Vit.Core.Module.Serialization.Qps/Properties/PublishProfiles/FolderProfile.pubxml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+https://go.microsoft.com/fwlink/?LinkID=208121. 
+-->
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <PublishProtocol>FileSystem</PublishProtocol>
+    <Configuration>Release</Configuration>
+    <Platform>Any CPU</Platform>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
+    <PublishDir>bin\Publish</PublishDir>
+    <SelfContained>false</SelfContained>
+    <_IsPortable>true</_IsPortable>
+  </PropertyGroup>
+</Project>

+ 115 - 0
dotnet/Library/Vit/Vit.Core/Test/Vit.Core.Module.Serialization.Qps/RpcContextData.cs

@@ -0,0 +1,115 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+
+namespace Sers.Core.Module.Rpc
+{
+    public class RpcContextData
+    {
+        //public RpcContextData() 
+        //{
+        //}
+
+
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public string Serialize()
+        {
+            //return Vit.Core.Module.Serialization.Serialization.Instance.SerializeToString(this);
+            return Vit.Core.Module.Serialization.Serialization_Text.Instance.SerializeToString(this);        
+        }
+
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public byte[] ToBytes() 
+        {
+            //return Vit.Core.Module.Serialization.Serialization.Instance.SerializeToBytes(this);
+            return Vit.Core.Module.Serialization.Serialization_Text.Instance.SerializeToBytes(this);
+        }
+
+        [MethodImpl(MethodImplOptions.AggressiveInlining)]
+        public static RpcContextData FromBytes(ReadOnlySpan<byte>data)
+        {
+            //return Vit.Core.Module.Serialization.Serialization.Instance.DeserializeFromSpan<RpcContextData>(data);
+            return Vit.Core.Module.Serialization.Serialization_Text.Instance.DeserializeFromSpan<RpcContextData>(data);
+        }
+
+
+        /*
+        {
+        "route": "/DemoStation/v1/api/5/rpc/2",
+        "caller": {
+            "rid": "8320becee0d945e9ab93de6fdac7627a",
+            "callStack": ["xxxx","xxxxxx"],    // parentRequestGuid array
+            "source": "Outside"
+        },
+        "http": {
+            "url": "https://127.0.0.1:6000/DemoStation/v1/api/5/rpc/2?a=1",
+            "method":"GET",
+            "statusCode":400,
+            "protocol":"HTTP/2.0",
+            "headers": {
+                "Cache-Control": "no-cache",
+                "Connection": "keep-alive",
+                "Content-Type": "application/javascript",
+                "Accept": "* / *",
+                "Accept-Encoding": "gzip, deflate",
+                "Authorization": "bearer",
+                "Host": "127.0.0.1:6000",
+                "User-Agent": "PostmanRuntime/7.6.0",
+                "Postman-Token": "78c5a1cb-764f-4e04-b2ae-514924a40d5a"
+            }
+        },
+	    "error":{SsError},
+        "user": {"userInfo":{} }
+    }             
+         
+         */
+
+
+
+
+
+        public string route;
+
+        #region caller
+
+        public Caller caller=new Caller();
+
+        public class Caller 
+        {
+            public string rid;
+            public List<string> callStack;
+            public string source;
+
+        }
+        #endregion
+
+
+        #region http
+        public Http http=new Http();
+        public class Http
+        {
+            public string url;
+            public string method;
+            public int? statusCode;
+            public string protocol;
+            public Dictionary<string, string> headers=new Dictionary<string, string>();
+
+            public string GetHeader(string key) 
+            {                
+                if (headers.TryGetValue(key, out var value)) return value;
+                return null;
+            }
+
+        }
+
+        #endregion
+
+
+        public object error;
+
+        public object user;
+
+ 
+
+    }
+}

+ 7 - 0
dotnet/Library/Vit/Vit.Core/Test/Vit.Core.Module.Serialization.Qps/StartConsole.bat

@@ -0,0 +1,7 @@
+
+ 
+dotnet Vit.Core.Module.Serialization.Qps.dll
+pause
+
+
+ 

+ 90 - 0
dotnet/Library/Vit/Vit.Core/Test/Vit.Core.Module.Serialization.Qps/Statistics/StatisticsQpsAsync.cs

@@ -0,0 +1,90 @@
+ 
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Linq;
+
+namespace Statistics
+{
+
+
+    public class QpsData 
+    {
+        public QpsData(StatisticsQpsAsync stat) 
+        {
+            lock (stat.qpsList) 
+            {
+                stat.qpsList.Add(this);
+            }
+        }
+
+        public long RequestCount = 0;
+ 
+    }
+
+
+    public class StatisticsQpsAsync
+    {
+        public  List<QpsData> qpsList = new List<QpsData>();
+
+  
+
+        bool finished = false;
+        public void Start(string name)
+        {
+            
+            finished = false;
+       
+            Console.WriteLine("¿ªÊ¼");
+
+            Task.Run(() => {
+
+                while (!finished)
+                {
+                    Console.WriteLine(ToString());
+                    Thread.Sleep(1000);
+                }
+
+            });
+
+
+        }
+        public void Stop()
+        {
+            finished = true;
+            Console.WriteLine("½áÊø");
+            Console.WriteLine(ToString());
+        }
+ 
+
+    
+
+        long lastSumCount = 0;
+    
+        DateTime lastTime=DateTime.Now;
+        public override string ToString()
+        {
+            var curTime = DateTime.Now;
+
+           var curSumCount = qpsList.Sum(data => Interlocked.Read(ref data.RequestCount));
+            //var curSumCount = qpsList.Sum(data =>  (long)data.RequestCount);
+
+            long curCount = curSumCount - lastSumCount;
+            double qps = curCount / (curTime - lastTime).TotalSeconds;
+            lastSumCount = curSumCount;
+            lastTime=curTime;
+
+            var msg = "";
+
+            //qps
+
+            msg += $" qps: {qps.ToString("0.00")} ";
+            msg += $" curCount: {curCount} ";
+            msg += $" sumCount: {curSumCount} ";
+           
+            
+            return msg;
+        }
+    }
+}

+ 21 - 0
dotnet/Library/Vit/Vit.Core/Test/Vit.Core.Module.Serialization.Qps/Vit.Core.Module.Serialization.Qps.csproj

@@ -0,0 +1,21 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>netcoreapp2.1</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\Vit.Core\Vit.Core.csproj" />
+  </ItemGroup>
+ 
+
+ 
+
+  <ItemGroup>
+    <None Update="StartConsole.bat">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+
+</Project>

+ 42 - 9
dotnet/Library/Vit/Vit.Core/Vit.Core/Module/Serialization/Serialization_Newtonsoft.cs

@@ -1,5 +1,4 @@
 using Newtonsoft.Json;
-using Newtonsoft.Json.Converters;
 using Vit.Extensions;
 using System;
 using Vit.Core.Util.ConfigurationManager;
@@ -10,7 +9,38 @@ namespace Vit.Core.Module.Serialization
     public class Serialization_Newtonsoft: Serialization
     {
         
-        public new static readonly Serialization_Newtonsoft Instance = new Serialization_Newtonsoft().InitByAppSettings(); 
+        public new static readonly Serialization_Newtonsoft Instance = new Serialization_Newtonsoft().InitByAppSettings();
+
+
+
+        public readonly Newtonsoft.Json.JsonSerializerSettings serializeSetting = new Newtonsoft.Json.JsonSerializerSettings();
+        public Serialization_Newtonsoft() 
+        {
+
+            //忽略空值
+            serializeSetting.NullValueHandling = NullValueHandling.Ignore;
+
+            //不缩进
+            serializeSetting.Formatting = Formatting.None;
+
+            //日期格式化
+            serializeSetting.DateFormatHandling = global::Newtonsoft.Json.DateFormatHandling.IsoDateFormat;
+            serializeSetting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
+
+
+
+            //Newtonsoft.Json.JsonSerializerSettings serializeSetting = new Newtonsoft.Json.JsonSerializerSettings();
+            //JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
+            //{
+            //    //日期类型默认格式化处理
+            //    //serializeSetting.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
+            //    //serializeSetting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
+            //    //空值处理
+            //    serializeSetting.NullValueHandling = NullValueHandling.Ignore;
+            //    //serializeSetting.Converters.Add(Serialize_DateTimeFormat);
+            //    return serializeSetting;
+            //});
+        }
 
 
         #region 成员对象
@@ -18,14 +48,17 @@ namespace Vit.Core.Module.Serialization
         /// <summary>
         /// 时间序列化格式。例如 "yyyy-MM-dd HH:mm:ss"
         /// </summary>
-        readonly IsoDateTimeConverter Serialize_DateTimeFormat = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
+        //readonly IsoDateTimeConverter Serialize_DateTimeFormat = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
 
         /// <summary>
         /// 设置时间序列化格式。例如 "yyyy-MM-dd HH:mm:ss"
         /// </summary>
         /// <param name="DateTimeFormat"></param>
-        public  void SetDateTimeFormat(string DateTimeFormat) {
-            Serialize_DateTimeFormat.DateTimeFormat = DateTimeFormat;
+        public  void SetDateTimeFormat(string DateTimeFormat) 
+        {
+            //Serialize_DateTimeFormat.DateTimeFormat = DateTimeFormat;
+
+            serializeSetting.DateFormatString = DateTimeFormat;
         }
 
  
@@ -76,15 +109,15 @@ namespace Vit.Core.Module.Serialization
             {
                 return value.Convert<string>();
             }
-
-            return JsonConvert.SerializeObject(value, Serialize_DateTimeFormat);
-
+            //return JsonConvert.SerializeObject(value, Serialize_DateTimeFormat);     
+            return JsonConvert.SerializeObject(value, serializeSetting); 
         }
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public override string SerializeToString(object value, Type type)
         {
-            return JsonConvert.SerializeObject(value,  Serialize_DateTimeFormat);
+            //return JsonConvert.SerializeObject(value, Serialize_DateTimeFormat);
+            return JsonConvert.SerializeObject(value, serializeSetting);
         }
 
         #endregion

+ 11 - 0
dotnet/Sers.sln

@@ -171,6 +171,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CmServer", "Library\Sers\Se
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sers.Core.Module.LocalApi.Qps", "Library\Sers\Sers.Core\Test\Sers.Core.Module.LocalApi.Qps\Sers.Core.Module.LocalApi.Qps.csproj", "{A2E07766-8290-446D-AD4E-D8277687D4C0}"
 EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Vit.Core.Module.Serialization.Qps", "Library\Vit\Vit.Core\Test\Vit.Core.Module.Serialization.Qps\Vit.Core.Module.Serialization.Qps.csproj", "{8D55E47B-102B-4905-BA35-40CDD2430B54}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -555,6 +557,14 @@ Global
 		{A2E07766-8290-446D-AD4E-D8277687D4C0}.Release|Any CPU.Build.0 = Release|Any CPU
 		{A2E07766-8290-446D-AD4E-D8277687D4C0}.Release|x86.ActiveCfg = Release|Any CPU
 		{A2E07766-8290-446D-AD4E-D8277687D4C0}.Release|x86.Build.0 = Release|Any CPU
+		{8D55E47B-102B-4905-BA35-40CDD2430B54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8D55E47B-102B-4905-BA35-40CDD2430B54}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8D55E47B-102B-4905-BA35-40CDD2430B54}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{8D55E47B-102B-4905-BA35-40CDD2430B54}.Debug|x86.Build.0 = Debug|Any CPU
+		{8D55E47B-102B-4905-BA35-40CDD2430B54}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8D55E47B-102B-4905-BA35-40CDD2430B54}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8D55E47B-102B-4905-BA35-40CDD2430B54}.Release|x86.ActiveCfg = Release|Any CPU
+		{8D55E47B-102B-4905-BA35-40CDD2430B54}.Release|x86.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -640,6 +650,7 @@ Global
 		{1B6172BF-405A-4752-B0A3-040F2E951F2A} = {0EF01864-BC8C-4C94-8F83-5BB6CC4FECB8}
 		{EBB905C2-7D58-4A4A-A7F7-2171DB1724AB} = {0EF01864-BC8C-4C94-8F83-5BB6CC4FECB8}
 		{A2E07766-8290-446D-AD4E-D8277687D4C0} = {37633A5F-54B5-4179-8BCD-B7B422B4857C}
+		{8D55E47B-102B-4905-BA35-40CDD2430B54} = {B0C8734C-7CAC-4EA4-BF49-4ECE4876BB5D}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {C7DA16E3-9949-49FA-B0B4-F830636DE60F}