Академический Документы
Профессиональный Документы
Культура Документы
JavaScript
Оптимальный алгоритм
Соотвествующие структуры данных
Не увлекатся попустуту
Изначально писать код средне оптимальным
Жесткую оптимизацию оставить на самый конец
Как исполняется ecmascript
Код Байт-код/ассемблер
while(++a); label: inc eax
jnz label
Цепь скоупов
_fn0
_fn1
_fnn
Ресолвинг переменных
(function(window)
{
var document = window.document,
documentElement = document.documentElement
;
})(window);
Приватный кеш для функции
(function()
{
var cachedVar = 1,
_cmp = function(a, b){ return a < b; },
_min = Math.min;
Class.prototype._fn = function(a, b)
{
this.array.sort(_cmp);
<script type="application/javascript;version=1.7"/>
let (
cachedVar = 1,
_cmp = function(a, b){ return a < b; },
_min = Math.min
)
{
Class.prototype._fn = function(a, b) {
this.array.sort(_cmp);
a = {} a = new Object()
Opera 10.52 906 1237
firefox 3.6 1319 1888
ie 3154 4016
chrome4 1218 1891
Создание Массива
A = [] a = new Array()
Opera 10.52 1144 1627
firefox 3.6 1234 1875
ie 3214 4136
chrome4 1284 1938
Меряем «тики» или сравнение сколько стоит
создание объекта/функции
switch(mod8) {
case 7: a[--j] = this[--i];
case 6: a[--j] = this[--i];
case 5: a[--j] = this[--i];
case 4: a[--j] = this[--i];
case 2: a[--j] = this[--i];
case 3: a[--j] = this[--i];
case 1: a[--j] = this[--i];
case 1: a[--j] = this[--i];
case 0: a[--j] = this[--i];
}
Лисп ^_^ или сокращаем ресолвинг
(
(
this.prototype = Object.create(_constuctor.prototype)
). constructor = this
).superClass = _constuctor;
Цыклы
for(j=0; j<m; j++) j=-1; while(++j<m) for(j=m; j>=0; j—) j=m; while(j--)
a = j; a = j; a = j; a = j;
Opera 10.52 4958 4920 4013 3763
firefox 3.6 5955 5083 5056 4193
ie 6492 4626 5106 3606
chrome4 10723 8756 9112 7137
Преобразования объектов/примитивов в булево
значение
0 Число != 0 пустая строка непуская строка object NaN Infinity null undefined
false true false true true false true false false
Обход цельных массивов
Object.prototype
A.prototype
B.prototype
Z.prototype
Ресолвинг свойств
this._fn0 = function()
{
this.publicVar = 1; Class closure classInst
a0 .publicVar
};
a1 ._fn0
};
Function.prototype._staticDeriveFrom = function(_constuctor)
{
var key, dpr = this.prototype, spr = _constuctor.prototype;
for(key in spr)
{
if(spr.hasOwnProperty(key) && !(key in dpr))
dpr[key] = spr[key];
}
return this;
};
Пример статического наследования
DerivedClass.prototype._fn1 = function() {
classInst
Class.prototype._fn0.call(this); .publicVar
};
for(j in a) {
j = a.length; while(j--) if(a.hasOwnProperty(j))
++k; ++k;
}
Opera 10.53 1181 2162
firefox 3.6 1418 2073
ie 1212 4998
chrome4 1925 2780
Ресолвинг функции с вызовом против
кеширования и вызова через .call
a = []; a = []
a._fn('b') _fn.call(a, 'b')
Opera 10.53 1236 1546
firefox 3.6 1641 2436
ie 5247 6549
chrome4 1476 1834
Проверка на undefined
(v = a['0']) !== undefined, v typeof(v = a['0']) !== 'undefined', v ('0' in a), a[i]
Opera 10.52 3055 2580 2113
firefox 3.6 3798 2456 1925
ie 3655 3005 4505
chrome4 5109 4216 3628
Вызов функции
Создание скоупа
Конструирование arguments *
jump
.each - зло
Динамическое создание
функции
$('div.a').each( jit
function(v) установка указателя на код функции
{ построение списка замыканий
$(v).removeClass('a');
}
Вызов функции
); ресолвинг функции
создание arguments
// или создание скоупа
a !== a _isNaN(a)
Opera 10.52 1175 1175
firefox 3.6 1052 1061
ie 1142 2674
chrome4 1920 1972
isFinite
_parseFloat(a) +a 1*a a - 0
Opera 10.52 695 403 464 435
firefox 3.6 531 416 402 391
ie 1212 380 401 391
chrome4 1039 744 791 823
Конвертируем вещественные числа в целые
re = new RegExp(/^link|tbody$/);
re.test(a) case 'link': case 'tbody':
Opera 10.52 2161 1723
firefox 3.6 3167 1726
ie 7572 2402
chrome4 4548 3118
String char access
if(String.nativeDirectCharAccess) {
_fn = new Function(
_fn._argsString(),
_fn._body().slice(1, -1).replace(/\.\s*charAt\s*\
(([^\)]*)\)/g, '[$1]');
}
.slice у строк не копирует (кроме ie)
while(n) {
if(n&1) prefix += str;
n >>= 1;
str += str;
}
return prefix;
};
Бинарные алгоритмы
var failCount = -1;
while(p < sLen) {
if(s.substr(p, matchMultyLen) === matchMulty) {
p += matchMultyLen; matchMultyLen <<= 1; matchMulty += matchMulty;
} else {
if(matchMultyLen === matchLen) break;
if(++failCount < 2) {
matchMulty = matchMulty.substr(0, (matchMultyLen >>= 1));
} else {
matchMultyLen = matchLen;
matchMulty = match;
failCount = -1;
}
}
}
Посткомпиляция
if('readyState' in s) {
checkerBody +=
"var rs = v.readyState; \
if(rs === 'loaded' || rs === 'complete')\
return true; \
else\
return false;";
}
if($w.opera) {
checkerBody += "if(v.text != null) return true;";
}
checkerBody += "return null;";
Карты оптимизации
String.prototype.trim = function()
{
return (this.lenght < 100) ? this.__trim1() : this.__trim2();
};
String.prototype.trim = ($w.opera) ?
function(){...}
: function(){...};
Карты оптимизации
0 100 2500
arg0
_fn0 _fn1 _fn2 +inf
_fn2 _fn0
1000
_fn3 _fn1
arg1
Карты оптимизации
Реализации ввиде отдельных функций
Хранение ввиде json/xml
Debug = Шаблозирование/препроцессинг на клиенте без инлайна
Release = Предварительное шаблонизирование под конкретный
браузер на сервере. Остатики на клиенте.
Автоматическая генерация
Кеширование предрассчитанных карт
Генерация на клиенте с его согласия*
$jb.Prepocessor
(new $jb.Prepocessor).
_define('_IS_FINITE($V)',
$jb._preprocessingTextBegin(function(){
($V&$V) !== 0 || $V === 0
})._preprocessingTextEnd()
);
General PreProcessor
#define _IS_FINITE($V)
($V&$V) !== 0 || $V === 0
#end
Контакты
Twitter: https://twitter.com/bga_
Email: mailto:bga.email@gmail.com
jabber/gtalk: bga.email@gmail.com
Сюда пишется заголовок слайда, также до 3
строк, не больше!