【问题标题】:The more request means slower read from cached objects?请求越多意味着从缓存对象中读取速度越慢?
【发布时间】:2019-01-16 14:31:43
【问题描述】:

请不要判断问题的类型。它可能与软件算法和概念有关。这就是为什么我必须写 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- 问题 ui 端的限制值如果是响应时间的 2 或 20 倍是好的。但是当它是450倍时。在客户端获得结果需要 40 秒。我知道代码组织得不好,但问题是为什么应用程序端负责进行更多计算时速度如此之慢。

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

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

【问题讨论】:

  • 你的算法是 O(n)。你需要一本字典。
  • 有各种性能分析器可用于此类故障排除。没有可重复的样本讨论是没有意义的。
  • “我找不到任何文档”?谷歌很容易把这个回复给我,blogs.msdn.microsoft.com/benjaminperkins/2017/12/13/…
  • 你想做什么?问题不清楚。 450 次函数调用的 40 秒看起来就像每次迭代的网络往返/上下文切换。请指定在服务器上调用什么函数,在客户端上调用哪个函数。另外,我怀疑Global.holidayGlobals.Values 没有存储在进程中,而是来自另一个进程,比如内存缓存。
  • 所以Global.holidayGlobalsDictionary&lt;TKey, TValue&gt;holidayGlobals 是 getter 每次访问时都从另一个源获取数据的属性吗?还是只是定义为Dictionary&lt;TKey, TValue&gt; holidayGlobals { get; set; }(空的getter和setter)?

标签: c# asp.net .net iis .net-remoting


【解决方案1】:

基本上这种类型的缓慢来自于犯了这个错误:

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

更新

从 cmets 到问题,holidays 似乎是 Dictionary&lt;int, HolidayEntity&gt; 如果是这样,代码可以像这样变得更好:

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;
}

【讨论】:

  • 比你,但我需要在不修改代码的情况下加速 iis
  • @BilginKılıç 如果响应缓慢是由于代码缓慢,我希望没有 iis 调整可以解决它。
  • 相同的代码在测试环境中运行,由于 GENERAL_READ_ENTITY_START 需要 0 毫秒,所以速度非常快。但在 prod 环境中,它或多或少需要 50 毫秒。当然代码修改可以解决它,但关键是为什么会出现差异
  • 那么为什么产品服务器比测试环境慢。相同的代码。所以请关注我们需要找出 GENERAL_READ_ENTITY_START 的细节。
  • @BilginKılıç 请更具体一点。什么是 50 毫秒? GENERAL_READ_ENTITY_START 和 GENERAL_READ_ENTITY_END 之间的时间?还是在 GENERAL_READ_ENTITY_START 和之前的事件之间?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2018-01-07
    • 2012-03-27
    • 2021-10-02
    • 2015-11-20
    • 2014-10-26
    • 2019-11-04
    相关资源
    最近更新 更多