Если ты используешь в функции new, то при каждом вызове функции переменная создается заново(это занимает некоторое время), а при выходе из функции высвобождается память(тоже за некоторое время). При использовании static объявления переменной, она создается только один раз.
Трюк0
Ну основное предназначение static - хранить значение переменной между вызовами функции, т.е. ты можешь вместо глобальных переменных использовать static внутри функции, если эти переменные нигде не используются больше, ради наглядности.
Трюк 1
Если тебе нужно использовать большое кол-во памяти(блок текста, new szString[1024] например) в функции, которая часто вызывается(PreThink, etc.), то ты можешь оптимизировать выполнение скрипта, используя static.
Трюк 2
Иногда компилятор думает, что функция рекурсивная, т.е. может вызывать сама себя, хотя это и не так и он не знает сколько памяти выделить, и расчитывает на использование стека(динамической памяти). Можно доказать компилятору, что функция не рекурсивная, используя в функции хотя бы 1 static переменную
Ограничение
В рекурсивных функциях нельзя использовать static
"Подводный камень"
В расчете на то, что при создании new переменной ей присваивается нулевое значение, можно забыть обнулить static переменную
Вот и все, что я про нее знаю...