Стоит ли запускать два цикла while, чтобы определить начальную точку и количество итераций цикла For? - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть базовый цикл for, который перебирает массив значений и выполняет код, если найдено определенное значение. Массив представляет собой столбец значений true или false, полученных из Google Sheet.

// array example: [[false], [false], [false], 
//                 [true], [false], [false],
//                 [false], [true], [false],
//                 [false], [false], [false]]

for (i = 0; i < array.length; i++) {
 if (array[i][0] === true) {
  // execute code
 }

Стоит ли (с точки зрения производительности) запускать два цикла while, чтобы определить, где должен начинаться цикл For и сколько раз он должен повторяться, или он будет в основном одинаковым?

var c = array.length - 1;
while (array[c][0] === false) {
 c--;
}

var d = 0;
while (array[d][0] === false) {
 d++;
}

var start_row = d+1;
var end_row = c+1;

for (i = start_row - 1; i < end_row; i++) {
 if (array[i][0] === true) {
  // execute code
 }

Оба эти цикла For, кажется, работают точно так же, но я надеялся получить некоторую информацию, если один будет предпочтительнее другого и почему. На мой взгляд, второй случай имеет больше смысла, так как цикл For не должен будет повторяться без необходимости с самого начала массива до конца, но я могу быть совершенно неправ, основываясь на том, как этот код на самом деле компилируется и казнены.

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Нет, потому что вычислительные затраты на интерпретатор js для циклов while не лучше, чем подход for, в то время как код становится менее читабельным.

Подход к определению интервалов индекса «компактных» данных лучше работает с компилируемыми языками (C / C ++), где вы (или компилятор) можете использовать методы развертывания циклов, которые требуются для работы в «компактном» массиве данных.

0 голосов
/ 11 сентября 2018

Текущая реализация Google Apps Script имеет некоторые интересные особенности, одна из которых заключается в том, что методы агрегированного массива, такие как map(), forEach(), some() и every(), работают лучше, чем ванильный цикл for , Я знаю, что это противоречит общепринятому мнению, но под капотом работают странные вещи.

Взгляните на следующий фрагмент:

var arr = [
        [false, false, false],
        [true, false, false],
        [false, true, false],
        [false, false, false]
    ];

arr.forEach(function(row){
    row.forEach(function(item){
        // do the things
    });
});

Верьте или нет, приведенный выше код может выполняться быстрее, чем ваш for цикл. Один из видных членов сообщества G + GAS - Канши Танаике - провел ряд тестов и сделал это открытие. Вы можете проверить его выводы по ссылке ниже:

https://gist.github.com/tanaikech/848aeafaac1ec676900bb78e3ce220b6

Надеемся, что скрипт Apps будет вести себя более обычным образом, когда он в конечном итоге будет обновлен для использования движка Chrome V8.

0 голосов
/ 11 сентября 2018

Если у вас нет особых потребностей для создания дополнительных циклов - нет особой причины для этого. В любом случае, эти два цикла while и цикл for будут повторять весь массив вместе. Основная цель в приведенных примерах - писать меньше кода, я думаю (вы не увеличите скорость выполнения с помощью предоставленного кода), поэтому я рекомендую просто использовать один цикл for, чтобы уменьшить размер вашей логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...