请不要对问题的类型进行评判。这可能与软件算法和概念有关。这就是为什么我必须在服务器故障时写the link的原因。

1-> Project .net Web应用程序的算法和概念。


  客户端的onblur事件进行ajax调用-> UI-> functionUI()-> APP
  <<


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,应用程序也可以非常快速地运行。

最佳答案

基本上,这种类型的缓慢是由犯以下错误引起的:

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),与一次往返到内存缓存的时间相比,可以忽略不计。

更新

从注释到问题,看来holidaysDictionary<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;
}

关于c# - 请求越多,意味着从缓存对象中读取速度越慢?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54219294/

10-12 14:12