请求越多意味着缓存对象的读取速度越慢?

问题描述 投票:2回答:2

请不要质疑问题的类型。它可能与软件算法和概念有关。这就是为什么我必须写the link它已经被问到服务器故障。

1->项目.net web app的算法和概念。

客户端的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-问题如果响应持续时间的2或20倍,则ui侧的限制值是好的。但是当它是450次。在客户端获得结果需要40秒。我知道代码组织不好,但问题是当应用程序负责进行更多计算时应用程序方面如此之慢。

任何线索都会非常有用。谢谢。

服务器是Server 2018 SP 1,.net Frame Work 4.0.30319.42000它只发生在生产环境中。在开发方面,应用程序运行速度非常快,即使限制为450。

c# asp.net .net iis .net-remoting
2个回答
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),与一次往返内存缓存的时间相比,这是微不足道的。

UPDATE

从评论到问题,似乎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;
}

1
投票

缓慢可能是由于服务器上的硬件,例如: - Ram,处理器。以及在服务器后台运行的服务或应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.