Comments 25
// функция-блок
blocks[‘my-block’] = function(arg1, arg2) { /* ... */ }
// функция-элемент – может быть обычным хелпером
// или может генерировать часть ответа функции-блока
blocks[‘my-block__elem’] = function(arg1, arg2) { /* ... */ }
В то время как весь мир переходит на статическую типизацию, вы используете текстовые ключи :-D
Может посмотрите в эту сторону?
// функция-блок
function $my_block (arg1, arg2) { /* ... */ }
// функция-элемент – может быть обычным хелпером
// или может генерировать часть ответа функции-блока
function $my_block__elem (arg1, arg2) { /* ... */ }
Или даже в эту:
class $my_block extends $ya_bem {
constructor (arg1, arg2) { /* ... */ }
elem (arg1, arg2) { /* ... */ }
}
Да, мы собираемся переходить на es6 классы. Предположительно будет что-то в духе последнего, но с возможностью доопределения классов как в ruby
(обычные классы это не умеют):
// deskpad
priv('my-block', {
main(data) {
let bemjson;
// ...
return bemjson;
},
elem1(data) {
// ...
}
};
// desktop
priv('my-block', {
elem2(data) {
// ...
}
};
module Ya {
export class Foo {
a = 1
}
export class Bar {
a = 1
}
}
module Ya.SERP {
export class Foo extends Ya.Foo {
b = 2
}
}
module Ya.SERP {
console.assert( (new Foo).a === 1 )
console.assert( (new Foo).b === 2 )
console.assert( (new Bar).a === 1 )
}
Почти все базовые типы — строки, бул, числа, объекты, функции, массивы (символы почему-то не могут). Но все приводятся к строке:
hash = {};
hash[1] = 1;
hash['s'] = 2;
hash[function(){}] = 3;
hash[[]] = 4;
hash[{}] = 5;
hash[true] = 6;
hash[Symbol('xyz')] = 7;
console.log(Object.keys(hash));
// [ '1', 's', 'function (){}', '', '[object Object]', 'true' ]
console.log(Symbol.for('xyz') in hash);
// false
символы почему-то не могут
не понял, что вы имеете ввиду:
hash = {};
sym = Symbol('test');
hash[sym] = 2;
sym in hash // true
hash[sym] // 2
sym === sym // true
Symbol.for('test') === sym // false
// но
customSym = Symbol.for('custom') // Symbol(custom)
customSym === Symbol.for('custom') // true
Symbol.for('custom') === Symbol.for('custom') // true
Но все приводятся к строке
кроме Symbol
По сути мы это и сделали, только собрали кумулятивную величину для каждой функции внутри обработки одного запроса и вывели медианы. Все это на большой выборке из реальных production-логов
Сорян, тогда я не понял, что хачит лайфхак
А поделитесь, находили ли вы способ более-менее быстрого профилирования в боевых условиях? Например тот же njstrace существенно замедляет работу больших приложений, причем настолько существенно, что кроме как на тестовом стенде его применять невозможно.
До NJSTrace
руки честно не дотянулись, а потом вышло выделенное на задачу время.
Поленился писать об этом в основной части, исправляюсь. Только что замерил время работы сервера под обстрелом без профилирования и с включенным профилированием в двух вариантах. В итоге: Instrumentation (обертка PRIV-ов с замером времени) дает +2.7% ко времени работы, а Sampling (v8-profiler) — это +114.7%
В боевых условиях можно использовать только "обертку", остальное только в тестовом стенде.
var t1 = process.hrtime();
doSomething();
var t2 = process.hrtime( t1); //будет такой же массив с разницей между t2 и t1 в таком же формате [sec, nanosec]
И нет ли ошибки в коде nano? умножать на 1e9 вроде надо второй элемент массива.
Для инструментирующего профилирования есть еще вот такое готовое решение (однако, только для ES5). Там правда «чуть по сложнее» будет код, чем тот, что в примерах выше :)
Можно также попробовать VTune. Недавно в node.js добавили его поддержку, правда требует пересборки node.js. Детали как пользовать — в этом видеодокладе. Для некоммерческого использования, open source проектов и студентов это бесплатно. Там как раз используется сэмплирование с помощью процессора и overhead небольшой (контролируется), плюс видно все сразу и нативный код и JavaScript.
Профилирование JS-кода из функций. Опыт Яндекса