Чем больше запрос означает медленное чтение из кэшированных объектов? - PullRequest
0 голосов
/ 16 января 2019

Пожалуйста, не судите по типу вопроса. Это может быть о программных алгоритмах и концепциях. Вот почему я должен написать ссылку , чтобы она уже запрашивалась при сбое сервера.

1-> алгоритм и концепция проекта .net web app.

Клиентское событие 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- Вопрос Предельное значение со стороны пользовательского интерфейса, если оно в 2 или 20 раз превышает длительность ответа, является хорошим. Но когда это в 450 раз. Требуется 40 секунд, чтобы получить результат на стороне клиента. Я знаю, что код не очень хорошо организован, но вопрос в том, почему сторона приложения так медленна, когда она отвечает за дополнительные вычисления.

Любая подсказка будет так полезна. Спасибо.

Серверы: Сервер 2018 SP 1, .net Frame Work 4.0.30319.42000 Это происходит только в производственной среде. При разработке приложение работает довольно быстро, даже если ограничение составляет 450.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

медлительность может быть связана с аппаратным обеспечением на сервере, например: - Ram, процессор. и службы или приложения, работающие в фоновом режиме на сервере.

0 голосов
/ 29 января 2019

В основном этот тип медлительности происходит из-за этой ошибки:

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

Из комментариев к вопросу видно, что 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;
}
...