Как мне оптимизировать петли + обещания? - PullRequest
0 голосов
/ 27 марта 2019

Я разрабатываю SAPUI5, развернутый на мобильном устройстве, с проблемами производительности.

Следующая функция возвращает обещание, Он перебирает категории и вопросы, используя циклы подчеркивания _each, Затем он выполняет READ по каждому вопросу по очереди, прежде чем окончательно обновить модель представления и решить обещание.

Есть ли какие-либо проблемы с этим и можно ли его дополнительно оптимизировать?

_getAnswers: function() {
  return new Promise(function(resolve, reject) {

    // Loop through Categories for questions.
    _.each(oViewData.categories, function(result, index) {

      // For each Category, read Answers for each Question 
      _.each(result, function(resultInner, indexInner) {

        // Read AnswerSet on QuestionId
        surveyModel.read("/AnswerSet", {
          filters: [
            new Filter("QuestionId", FilterOperator.EQ, resultInner.QuestionId)
          ],
          success: function(oData) {
            oData.results = _.sortBy(oData.results, 'AnswerId');
            // Populate Answer Array for Question
            var oAnswersArray = [];

            _.each(oData.results, function(resultInnerInner, indexInnerInner) {
              oAnswersArray.push(resultInnerInner);
            });

            // Check what the current Answer is for the Question.
            _.each(oAnswersArray, function(answerData, answerIndex) {
              if (oViewData.categories[resultInner.CategoryId].questions[a].AnswerId === oAnswersArray[answerIndex].AnswerId) {
                oAnswersArray[answerIndex].Selected = true;
              }
            });

            // Write back the Answer Array to the viewModel
            oViewData.categories[resultInner.CategoryId].questions[a].answers = oAnswersArray;
            oViewModel.setData(oViewData);

            // Go to next Question in the Loop.
            a++;

            // resovle Promise and continue.
            resolve(true);
          },
          error: function(oError) {}
        });
      });
    });
  });
}

1 Ответ

0 голосов
/ 27 марта 2019

В информатике есть термин, называемый «обозначение Big O '». Это используется для измерения времени, которое ваш алгоритм занимает с учетом объема данных. В целом, вложенные циклы увеличивают время вычислений.

То, что вы делаете, известно как O (N ^ 2), где каждый вложенный цикл увеличивает экспоненту.

Пожалуйста, прочитайте это: https://rob -bell.net / 2009/06 / a-beginners-guide-to-big-o-notation /

На вашем месте я бы изменил способ доступа к данным и посмотрел бы на лучшую структуру, не включающую вложенные циклы.

т.е. Не загружайте элементы в категориях, пока не будет нажата категория.

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

...