Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 服务调用的性能超出了库的预期_C#_.net_Model View Controller_Console Application_Performance Testing - Fatal编程技术网

C# 服务调用的性能超出了库的预期

C# 服务调用的性能超出了库的预期,c#,.net,model-view-controller,console-application,performance-testing,C#,.net,Model View Controller,Console Application,Performance Testing,我试图找出两个场景的一些性能值。我想我刚开始只是要宣布显而易见的事实。但当我得到结果时,我有点困惑。现在我正在为这个案子寻找理由 我有一个库,它通过MongoDb数据库和Active Directory服务进行两次查询,然后将结果返回给客户端,这是: GetUserType-对于MongoDb-有一个集合,它的所有文档中都有用户名和类型字段。在查询中,我给出用户名并要求输入类型字段 登录检查-到Active Directory-给定客户端的用户名和密码,我创建一个PrincipalContex

我试图找出两个场景的一些性能值。我想我刚开始只是要宣布显而易见的事实。但当我得到结果时,我有点困惑。现在我正在为这个案子寻找理由

我有一个库,它通过MongoDb数据库和Active Directory服务进行两次查询,然后将结果返回给客户端,这是:

  • GetUserType-对于MongoDb-有一个集合,它的所有文档中都有用户名和类型字段。在查询中,我给出用户名并要求输入类型字段
  • 登录检查-到Active Directory-给定客户端的用户名和密码,我创建一个
    PrincipalContext
    对象来访问AD服务器并调用
    ValidateCredentials
目前,此作业正在现有MVC应用程序上执行。我们将创建一个新的桌面应用程序,并将其用于相同的作业

我们很好奇这两种场景会有多大的不同?我们认为,在没有任何http连接的情况下直接调用库比毫不犹豫地请求服务性能更好。但我们仍然想知道有多少不同,如果可以接受,我们将通过rest MVC服务使其工作——原因如下:)

因此,我们测试了以下体系结构:

场景1:

for(var i = 0; i<10000; i++)
{
    new Class1().HeavyMethod();
}
// client side
for(var i = 0; i<10000; i++)
{
    using ( var client = new HttpClient() )
    {
        var values = new Dictionary<string, string>();
        var content = new FormUrlEncodedContent(values);
        var response = client.PostAsync("http://localhost:654/Home/HeavyLift", content).Result;
        var responseString = response.Content.ReadAsStringAsync().Result;
    }
}

// MVC rest service
public class HomeController : Controller
{
    public JsonResult HeavyLift()
    {
        return Json(new Class1().HeavyMethod(), JsonRequestBehavior.AllowGet);
    }
}
public class Class1
{
    public string HeavyMethod ()
    {
        var userName = "asdfasdfasd";
        var password = "asdfasdfasdf";
        try
        {
            // this call is to MongoDB
            var userType = Personnel.GetPersonnelsType(userName).Result;  
            // this call is to Active Directory  
            var user = new ADUser(new Session 
            { 
                UserType = userType.Type, 
                UserName = userName, 
                Password = password 
            });

            return userType.Type + "-" + user.Auth();
        }
        catch ( Exception e )
        {
            return e.Message;
        }
    }
}

场景2:

for(var i = 0; i<10000; i++)
{
    new Class1().HeavyMethod();
}
// client side
for(var i = 0; i<10000; i++)
{
    using ( var client = new HttpClient() )
    {
        var values = new Dictionary<string, string>();
        var content = new FormUrlEncodedContent(values);
        var response = client.PostAsync("http://localhost:654/Home/HeavyLift", content).Result;
        var responseString = response.Content.ReadAsStringAsync().Result;
    }
}

// MVC rest service
public class HomeController : Controller
{
    public JsonResult HeavyLift()
    {
        return Json(new Class1().HeavyMethod(), JsonRequestBehavior.AllowGet);
    }
}
public class Class1
{
    public string HeavyMethod ()
    {
        var userName = "asdfasdfasd";
        var password = "asdfasdfasdf";
        try
        {
            // this call is to MongoDB
            var userType = Personnel.GetPersonnelsType(userName).Result;  
            // this call is to Active Directory  
            var user = new ADUser(new Session 
            { 
                UserType = userType.Type, 
                UserName = userName, 
                Password = password 
            });

            return userType.Type + "-" + user.Auth();
        }
        catch ( Exception e )
        {
            return e.Message;
        }
    }
}

基本上,我为性能测试所做的是:

对于场景1:

for(var i = 0; i<10000; i++)
{
    new Class1().HeavyMethod();
}
// client side
for(var i = 0; i<10000; i++)
{
    using ( var client = new HttpClient() )
    {
        var values = new Dictionary<string, string>();
        var content = new FormUrlEncodedContent(values);
        var response = client.PostAsync("http://localhost:654/Home/HeavyLift", content).Result;
        var responseString = response.Content.ReadAsStringAsync().Result;
    }
}

// MVC rest service
public class HomeController : Controller
{
    public JsonResult HeavyLift()
    {
        return Json(new Class1().HeavyMethod(), JsonRequestBehavior.AllowGet);
    }
}
public class Class1
{
    public string HeavyMethod ()
    {
        var userName = "asdfasdfasd";
        var password = "asdfasdfasdf";
        try
        {
            // this call is to MongoDB
            var userType = Personnel.GetPersonnelsType(userName).Result;  
            // this call is to Active Directory  
            var user = new ADUser(new Session 
            { 
                UserType = userType.Type, 
                UserName = userName, 
                Password = password 
            });

            return userType.Type + "-" + user.Auth();
        }
        catch ( Exception e )
        {
            return e.Message;
        }
    }
}
连续10000个电话的结果令人震惊:

场景1:159181毫秒

场景2:13952毫秒

场景1
在最初的几次调用中非常快速地开始,然后开始减速。
Scenario 2
虽然通过10k呼叫提供了恒定的响应时间

这里到底发生了什么


注意:我检查了此场景运行的服务器的内存和cpu使用情况(所有内容都在同一台服务器上运行),但实际上没有什么有趣的事情,它们在内存和cpu资源方面的行为完全相同。

您是否在版本配置中编译了这两种情况?因为调试会对性能产生巨大影响,所以有没有用于查询数据库的ORM?我在想,如果不能从类库中正确使用ORM会话,它会变脏,而每个Http请求都会创建新的ORM会话。但一般来说,问题是缺少细节,我们无法重现这个问题,我们必须猜测。这些来自控制台应用程序的调用都是同步的吗?没有异步/等待魔法?这里是猜测,但是有没有可能缓存服务案例?具体来说,我的Worker库是否仍被调用10000次?良好的启动和下降性能可能表明存在GC问题。在java世界中,你们可以阅读通常被称为“低延迟”的福音书,其中大多数思想对C#也有好处