понедельник, 15 апреля 2013 г.

Список имен всех контроллеров в Django

Относительно недавно решил интересную задачу.
Дано: достаточно объемное приложение на Django. Нужно: собрать имена всех контроллеров по файлам urls.py.

Решение:
get_viewname_list.py

суббота, 5 января 2013 г.

Оптимизация производительности Javascript (Предварительное вычисление функций).

Метавычисления и вычисления в computer scince - это как алгебра и арифметика. Если обычная арифметика оперирует конкретными числами, то алгебра - переменными, которые по своей сути являются абстракцией от чисел. Если при обычных вычислениях в процессе выполнения кода исполнитель (интерпретатор кода) оперирует конкретными значениями, то при метавычислениях - абстрактными типами. Есть всего три самых популярных задачи метавычислений: специализация программ, их композиция и инверсия. Все они легко ищутся в сети. Остановимся на специализации, которая заключается в изменении исходного кода программы с учетом входных данных, например из программы которая считает квадратный корень положительного числа можно получить программу, которая будет считать квадратный корень 0 или 4. Код будет меньше и быстрее, но будет считать только для 0 и 4.
Браузерный Javascript - вещь тормознутая и это очевидно. Есть старый прием, когда для "тяжелых" по скорости функций используют кэширование. Прием простой и эффективный, декоратор кэша на js пишется легко и не принужденно. Но, мне почему захотелось пойти дальше и просчитывать результат функции ДО её выполнения. Т.е. при выполнении кода уже у клиента, вместо выполнения функции будет просто возвращаться заранее просчитанный результат из массива. Конечно, такой трюк возможен, только при известных заранее аргументов этой функции, что далеко не всегда, но все же. В итоге мы получаем прирост (увы, не всегда) в скорости при увеличении объема кода.
Написав, опять же на Js, небольшой код, который бы по переданной в виде Plain Text'а кода функции возвращал код вычисленной функции начал все это тестировать. И вот в чем беда: в Js мало того, что плохо с математикой, работой с DOM (все очень медленно), так еще и работа с массивами тоже не ахти.
Ниже логи для моих браузеров (код оптимизированной функции преводить не буду, ибо здоровый он очень):

Source:
function(x1, y1, x2, y2){return 1 + Math.pow(Math.sin((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)),2)}

Chrome:
Time without pre-optimisation: 290

Build Time (template "{}"): 756

Time with pre-optimisation: 161

Build Time (template "[]"): 689

Time with pre-optimisation: 137

Firefox:
Time without pre-optimisation: 262

Build Time (template "{}"): 1122

Time with pre-optimisation: 116

Build Time (template "[]"): 851

Time with pre-optimisation: 80


Opera:
Time without pre-optimisation: 151

Build Time (template "{}"): 1012

Time with pre-optimisation: 71

Build Time (template "[]"): 660

Time with pre-optimisation: 87

Сама ссылочка на тесты: Тык

На днях надо написать UI к этому всему.