Паб Sub/Архитектура, управляемая событиями - это обычная практика в мире JavaScript и сервера. Мне было поручено архитектовать очень большое веб-приложение, используя Dojo в качестве Front End и node.js в качестве бэкэнд. Pub/Sub кажется очень привлекательным, поскольку он позволяет многим parallelism среди команд. Однако я боюсь, если будут последствия для производительности.
У меня есть общий вопрос о стоимости событий и обработчиков событий в JavaScript. Я уже видел этот, этот, этот, даже и . Но я по-прежнему не вижу ответа общего назначения. Независимо от фреймворков, предположим, что у нас 2 метода
publish() //Like jQuery / Dojo trigger(), EventEmitter emit()
и
subscribe() //Like jQuery / Dojo / EventEmiter / DOM on() connect() live() addEventListener()
Проблема 1: Какова стоимость каждого триггера события?
Случай 1: Очиститель (слабосвязанный) Код, подчеркивающий Pub/Sub
object.publish('message1', data);
object.publish('message2', data);
...
object.publish('message100', data);
//All these are in separate files / modules
subscribe (object, 'message1', function (data) { A()...})
subscribe (object, 'message2', function (data) { B()...})
subscribe (object, 'message100', function (data) { Z()...})
Случай 2: Тесно связанный код! Но более ли он более эффективен?
data.message = 'message1'
object.publish('message', data)
subscribe (object, 'message', function (data) {
switch (data) {
case 'message1':
A();
break();
case 'message2':
B();
break();
...
case 'message100':
Z();
break();
}
})
Проблема 2: Какова стоимость каждого слушателя событий?
object.publish('event', data);
Случай 1: Опять же, очищающий (слабосвязанный) код, подчеркивающий Pub/Sub
//A.js
subscribe (object, 'event', function (data) {
A();
});
//B.js
subscribe (object, 'event', function (data) {
B();
});
//C.js
subscribe (object, 'event', function (data) {
C();
});
Случай 2: Опять же, Тесно связанный код! Но более ли он более эффективен?
subscribe (object, 'event', function (data) {
A();
B();
C();
});
Q1: Может кто-то указать мне на исследования и тесты производительности, выполненные для этого на стороне клиента (с использованием DOMEvents или пользовательских событий), на стороне сервера (EventEmitter и более в Node.js)? Его упрощенный пример, но он может легко вырасти до 1000 таких вызовов, так как приложение довольно велико. Если нет, то как мне перейти на бенчмаркинг для заметной деградации производительности? Может быть, с чем-то вроде jsperf? Любая теоретическая основа для того, чтобы знать hwy, более эффективна, чем другая?
Q2: Если Case 1s более эффективен, что лучший способ написать свободно связанный код? Любой метод поиска середины? Написание кода типа Case 1, но некоторый процесс компиляции/сборки промежуточной части, чтобы превратить его в Случай 2 (что-то вроде Google Closure компилятор в других перфомансах?), используя [Esprima]. Мне не нравится усложнять процесс сборки даже больше, чем есть. Это повышение производительности (если оно есть) стоит всего этого?
Q3: Наконец, хотя я ищу конкретный конкретный ответ на JavaScript, это может помочь узнать затраты на производительность на других языках/средах. Тот факт, что в большинстве случаев события вызваны аппаратным обеспечением (с использованием концепции прерываний), вносит свой вклад в ответ?
Спасибо всем, кто сделал это до конца этого Q!!! Очень ценю!!!