请不要判断问题的类型。这可能与软件算法和概念有关。这就是为什么我必须写the link服务器故障时已经要求它的原因。
1->项目.net Web应用程序的算法和概念。
客户端的onblur事件进行ajax调用-> UI-> functionUI()->> APP <<< / p>
functionUI()
int limit=450;
public bool functionUI(){
for(int i=0;i< limit ; i++){
functionApp(i);
}
}
public static bool functionApp(int i){
foreach(HolidayEntity h in Global.holidayGlobals.Values /*CachedList*/){
if(h.Value == i){
return false;
}
return true;
}
}
2-问题 从ui端开始的极限值是响应持续时间的2或20倍。但是当它是450倍的时候。在客户端获得结果需要40秒。我知道代码的井井有条,但是问题是为什么当应用程序负责执行更多的计算时,应用程序端如此之慢?
任何线索都会如此有用。谢谢。
服务器是Server 2018 SP 1,.net Frame Work 4.0.30319.42000 它仅在生产环境中发生。 在开发方面,即使限制为450,应用程序也运行得非常快。
答案 0 :(得分:6)
基本上,这种类型的缓慢是由于犯了以下错误而引起的:
for (var i = 0; i<100; i++)
{
// do a network-roundtrip/remoting/io/etc
}
,解决方案是将其更改为:
// do a network-roundtrip/remoting/io/etc
for (var i = 0; i<100; i++)
{
// do something with the result of the above call
}
因此,如果我对您的理解正确,那么数据Global.holidayGlobals.Values
来自另一个进程,例如内存缓存。如果是这样,最简单的选择就是将代码更改为:
int limit=450;
public bool functionUI()
{
var holidays = Global.holidayGlobals.Values;
for(int i=0;i< limit ; i++)
{
functionApp(i, holidays);
}
}
public static bool functionApp(int i, IEnumerable<HolidayEntity> holidays)
{
foreach(var h in holidays)
{
if(h.Value == i)
{
return false;
}
}
return true;
}
我们仍然在循环中做很多工作(我们可以通过创建字典并仅查找字典来改进算法),但是对于您的数字(450),与一次往返到内存缓存的时间相比,可以忽略不计。
更新
从评论到问题,看来holidays
是Dictionary<int, HolidayEntity>
,如果这样,代码会变得更好:
public bool functionUI()
{
var holidays = Global.holidayGlobals.Values;
for(int i=0;i< limit ; i++)
{
functionApp(i, holidays);
}
}
public static bool functionApp(int i, IEnumerable<HolidayEntity> holidays)
{
if (holidays.TryGetValue(i, out var h))
{
return false;
}
return true;
}
答案 1 :(得分:1)
速度缓慢可能是由于服务器上的硬件所致,例如:-Ram,处理器。以及在服务器后台运行的服务或应用程序。