Расскажите о некоторых мелких деталях оптимизации производительности кода.

задняя часть Архитектура WeChat API
Расскажите о некоторых мелких деталях оптимизации производительности кода.

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


Оптимизация цикла

    1. Уточните концепцию, вызов метода, даже если в методе есть только один оператор, потребляет, включая создание кадра стека, защиту сцены при вызове метода и восстановление сцены при вызове метода. Так, например, следующая операция:


    for (int i = 0; i < list.size(); i++)

    {

    ...

    }

    Рекомендуется заменить на:

    for (int i = 0, int length = list.size(); i < length; i++)

    {

    ...

    }


    Кроме того, если в структуре цикла есть вычисление условий логического суждения, независимых от элементов цикла, например, если (A > B && B > C), рекомендуется заменить его на if(conditionD).


    2. Вынести все вычисления, не связанные с переменными цикла, за пределы цикла, что не поясняется.

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

    4. Не продолжайте создавать ссылки на объекты в цикле

    Например:

    for (int i = 1; i <= count; i++)

    {

    Object obj = new Object();

    }


    Такой подход приведет к тому, что в памяти будет существовать количество ссылок на объекты объекта count.

    Object obj = null;

    for (int i = 0; i <= count; i++)

    {

    obj = new Object();

    }



    Оптимизация логических суждений


    1. Попробуйте использовать стратегию «ленивой загрузки», то есть создавайте ее тогда, когда она нужна

    Например:

    String str = "forest";

    if (i == 1)

    {

    list.add(str);

    }


    Рекомендуется заменить на:


    if (i == 1)

    {

    String str = "forest";

    list.add(str);

    }


    2. Операторы switch отсортированы по частоте появления, а наиболее часто используемые помещаются вверху, чтобы уменьшить ошибочные суждения.

    3. Оператор if ставит условие слабого вычисления впереди, чтобы избежать избыточного вычисления.

    4. Когда строковые переменные и строковые константы равны, записывайте строковые константы впереди, что является относительно распространенным приемом. Например:


    String str = "forest";

    if (str.equals("forest"))

    {

    ...

    }


    Предлагается изменить на:


    String str = "forest";

    if ("forest".equals(str))

    {

    ...

    }



    Оптимизация выражений


    1. Уменьшите вычислительную нагрузку, используйте операции сдвига для умножения и деления, используйте сдвиги вместо умножения и деления целых чисел, кратных 2,

    Используйте побитовые операции вместо операций с остатком.


    Например:


    for (val = 0; val < 100000; val += 5)

    {

    a = val * 8;

    b = val / 2;

    }

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


    for (val = 0; val < 100000; val += 5)

    {

    a = val << 3;

    b = val >> 1;

    }


    2. Оптимизация булевой логики, это тоже деталь, на которую люди не обращают особого внимания.Например, преобразование !a && !b в !(a || b) сократит много вычислений программы.


    небольшое резюме

    На самом деле в коде есть еще много моментов, которые можно оптимизировать. Цель этих примеров — проиллюстрировать один момент. Если вы будете больше думать и уделять больше внимания деталям выполнения каждого оператора, вы можете получить много и улучшить.



    Отсканируйте QR-код или вручную выполните поиск в общедоступной учетной записи WeChat [стек архитектуры]: ForestNotes

    Добро пожаловать на перепечатку, принесите следующий двумерный код