C# 服务调用的性能超出了库的预期
我试图找出两个场景的一些性能值。我想我刚开始只是要宣布显而易见的事实。但当我得到结果时,我有点困惑。现在我正在为这个案子寻找理由 我有一个库,它通过MongoDb数据库和Active Directory服务进行两次查询,然后将结果返回给客户端,这是: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
- GetUserType-对于MongoDb-有一个集合,它的所有文档中都有用户名和类型字段。在查询中,我给出用户名并要求输入类型字段
- 登录检查-到Active Directory-给定客户端的用户名和密码,我创建一个
对象来访问AD服务器并调用PrincipalContext
ValidateCredentials
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#也有好处