Как myArray.size () реализован в Salesforce Apex? Получает ли метод значение, хранящееся в объекте List.class, или вычисленное во время вызова? - PullRequest
0 голосов
/ 14 июля 2020

Часто, когда я пишу al oop в Apex, мне интересно, неэффективно ли вызывать myArray.size () внутри al oop. Мой вопрос на самом деле: следует ли мне использовать myArray.size () внутри l oop или хранить myArray.Size () в переменной Integer перед запуском l oop и повторно использовать это вместо этого (при условии, что размер myArray остается постоянным ).

Под капотом метод либо подсчитывает каждый элемент массива, перебирая его и увеличивая переменную размера, которую он затем возвращает, либо класс List / Set / Map et c сохраняет размер переменная внутри себя и обновляет значение при каждом изменении массива. Разные языки обрабатывают это по-разному, так как же работает Apex?

Я искал, но не нашел ответа. Ответ может изменить способ кодирования, поскольку вызов myArray.size () может экспоненциально увеличить количество операций, выполняемых при вызове внутри al oop.

Я попытался запустить тест для двух сценариев ios как указано ниже, и обнаружил, что myList.size () действительно занимает больше времени, но на самом деле не ответил на мой вопрос. Тем более, что код был слишком простым, чтобы действительно иметь значение.

В обоих примерах список состоит из десяти тысяч элементов, и я начал отсчет времени только после того, как список был полностью создан. Сам l oop ничего интересного не делает. Это просто считается. Это была наименее ресурсоемкая вещь, о которой я мог придумать.

Пример 1 - сохранить размер списка в виде целого числа перед вводом l oop:

List<Account> myArray = [SELECT Id FROM Account LIMIT 10000];

Long startTime = System.now().getTime();
Integer size = myArray.size();

Integer count = 0;
for (Integer i = 0; i < 100000; i++) {
    if (count < size) {
        count++;
    }
}

Long finishTime = System.now().getTime();

Long benchmark = finishTime - startTime;
System.debug('benchmark: ' + benchmark);

Результаты после 5 запусков: 497, 474, 561, 445, 474

Пример 2 - используйте myArray.size () внутри l oop:

List<Account> myArray = [SELECT Id FROM Account LIMIT 10000];


Long startTime = System.now().getTime();

Integer count = 0;
for (Integer i = 0; i < 100000; i++) {
    if (count < myArray.size()) {
        count++;
    }
}

Long finishTime = System.now().getTime();

Long benchmark = finishTime - startTime;
System.debug('benchmark: ' + benchmark);

Результаты после 5 пробежек: 582, 590, 667, 742, 730

Образец 3 - просто для хорошей оценки (контроля), вот l oop без условия if:

Long startTime = System.now().getTime();

Long count = 0;
for (Integer i = 0; i < 100000; i++) {
    count++;
}

Long finishTime = System.now().getTime();

Long benchmark = finishTime - startTime;
System.debug('benchmark: ' + benchmark);

Результаты после 5 пробежек: 349, 348, 486, 475, 531

...