80
JavaScript на сервере, 1ms на трансформацию Андрей Сумин, Mail.ru

JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

  • Upload
    ontico

  • View
    1.105

  • Download
    4

Embed Size (px)

Citation preview

Page 1: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

JavaScript на сервере,1ms на трансформацию

Андрей Сумин, Mail.ru

Page 2: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Зачем?

Page 3: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Зачем?— Пишут одни, а используют другие

Page 4: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Зачем?— Пишут одни а используют другие— JavaScript специалисты

Page 5: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Зачем?— Пишут одни а используют другие— JavaScript специалисты— Шаблонизация на клиенте

Page 6: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Что нужно

Page 7: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

XSLT JS

Page 8: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

XSLT JS

Page 9: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

XSLT/head.xml

<title><fest:get name="title"/></title><fest:set name="title">Mail.ru</fest:set>

Page 10: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

XSLT/head.xml

<title><fest:get name="title"/></title><fest:set name="title">Mail.ru</fest:set>

/mail.xml<fest:include src="head.xml"/><fest:set name="title">Почта</fest:set>

Page 11: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

JavaScript<fest:script>

var text = "mail.ru"</fest:script><fest:value>text</fest:value>

Page 12: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

JavaScript<fest:script>

var text = "mail.ru"</fest:script><fest:value>text</fest:value>

mail.ru

Page 13: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

XML

Page 14: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

XML— IDE

Page 15: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

XML— IDE— Валидация из коробки

Page 16: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

XML— IDE— Валидация из коробки— Name spaces

Page 17: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

XML— IDE— Валидация из коробки— Name spaces— SAX, XSLT, XSD, DTD …

Page 18: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

XML— IDE— Валидация из коробки— Name spaces— SAX, XSLT, XSD, DTD ...— XML to XML

Page 19: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Реализация

Page 20: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Ковбойство

Page 21: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Структураvs

Функция

Page 22: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Структура vs функция[ {action:"template"},

"<html>...",{action:"value"},"json.value"]

Page 23: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Структура vs функция[ {action:"template"},

"<html>....”,{action:"if"},"json.value","<span>true</span>","<span>false</span>"]

Page 24: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Структура vs функцияfunction template(json){

var html = "";html += "<html>…";html += json.value;return html;

}

Page 25: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Структура vs функция

Page 26: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

200ms

Page 27: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

3ms

Page 28: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Структура vs функцияfest:forearch for(i = 0; i < l; i++) {}fest:if if(value) {}fest:choose if(value) {} else {}

fest:set set[name] = functionset[name] = function

Page 29: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Структура vs функция<span> html += "<span>"; mail.ru html += "mail.ru";</span> html += "</span>";

Page 30: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Структура vs функция<span> html += "<span>"; mail.ru html += "mail.ru";</span> html += "</span>";

html += "<span>mail.ru</span>";

Page 31: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

30%

Page 32: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Безопасность

Page 33: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

try catch

Page 34: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

try catchescape

Page 35: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Безопасность<fest:value>json.name</fest:value>try {

html += escape(json.name);} catch(e) {

log(e.message);}

Page 36: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Интеграция

Page 37: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Интеграция— С— Perl— Python— NodeJS

Page 38: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Интеграция— С fest_log— Perl fest_file— Python fest_dirname— NodeJS

Page 39: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Интеграция— С fest_log— Perl fest_file— Python fest_dirname— NodeJS

— Браузер

Page 40: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Реальные пользователи

Page 41: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

4ms

Page 42: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Реальные пользователиmsg_length = 5msg_1_title = "letter"msg_1_Unread = 1

Page 43: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Реальные пользователиmsg_length = 5msg_1_title = "letter"msg_1_Unread = 1

msg = [ {title: "letter", Unread: true} ]

Page 44: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Реальные пользователиhash -> v8 api -> JavaScripthash -> string -> JSON.parse -> JavaScripthash -> string -> compile -> Javascript

Page 45: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Реальные пользователиLocal<String> script = String::new(

"template(\"{value:'mail.ru'}\")");Local<Script> cs = Script::Compile( script );Local<Value> result = cs->Run();

Page 46: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

2 + 4 = 6ms

Page 47: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

67%

Page 48: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

NodeJS

Page 49: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

NodeJS 4ms

Page 50: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Реальные пользователиmsg_length = 5msg_1_title = "letter"msg_1_Unread = 1

Page 51: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Реальные пользователиmsg_length = 5msg_1_title = "letter"msg_1_Unread = 1

get('msg_' + i + '_title')

Page 52: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

3ms

Page 53: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Реальные пользователи30 часов одно ядро 2.2 ГГц Xeon10 000 000+ хитов1.6ms среднее время трансформации992 422 10% между 2 и 5ms208 464 2% между 5 и 10ms396 49 0,4% больше 10ms

Page 54: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Продакшен, главная

Page 55: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

50% x3

Page 56: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

65+100=165кб

Page 57: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

RB lite v8 lite

Page 58: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Почти продакшенhtml += "foo";html += rb(id);html += "bar";

Page 59: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Почти продакшенhtml += "foo"; push_string("foo");html += rb(id); push_rb(id);html += "bar"; push_string("bar");

Page 60: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

50% x2

Page 61: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

440 000 000

Page 62: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

440 000 000110 000 000

Page 63: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
Page 64: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Данные на сегодняРазмер HTML, который генерирует v8 65кб.

Время, работы v8 на запрос 1ms.

В среднем v8 требует 40MB на контекст.

Page 65: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Проблемы v8

Page 66: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

http://sysoev.ru/prog/v8.html

Page 67: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)
Page 68: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Полезные ссылки— http://code.google.com/p/v8/— https://github.com/mailru/fest— http://sysoev.ru/prog/v8.html

Андрей Сумин, [email protected]

Page 69: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

Возможности fest

Page 70: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

fest:value<fest:value>json.name</fest:value>try {

html += escape(json.name);} catch(e) {

log(e.message);}

Page 71: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

fest:value<fest:value output="text">json.name</fest:value>try {

html += json.name;} catch(e) {

log(e.message);}

Page 72: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

fest:value<fest:value safe="true">json.name</fest:value>

html += json.name;

Page 73: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

fest:if<fest:if test="json.condition">…</fest:if>

try{ condition = json.condition } catch(e) { log(e) }

If (condition){ … }

Page 74: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

fest:choose<fest:choose>

<fest:when test="json.condition">…</fest:when><fest:when test="false">…</fest:when><fest:otherwise>…</fest:otherwise>

</fest:choose>

Page 75: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

fest:choosetry{ condition = json.condition } catch(e) { log(e) }If (condition){…}else{

try{ condition = false } catch(e) { log(e) }if (condition){}else {} }

Page 76: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

fest:foreach<fest:foreach iterate="list" index="i"></fest:foreach>var i;try{ foreach = list } catch(e) { foreach=[]; log(e) }var l = list.length;for(i = 0; i < l ; i++) { … }

Page 77: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

fest:for<fest:for iterate="hash" index="i"></fest:for>var i;try{ for = hash } catch(e) { for={}; log(e) }for(i in for) { … }

Page 78: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

fest:space<fest:space/>

html += " ";

Page 79: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

fest:script<fest:script> … </fest:script>

try{ … } catch (e) { log(e) }

Page 80: JavaScript на сервере, 1ms на трансформацию (Андрей Сумин)

fest:insert<script>

<fest:insert src="script.js"/></script>

html += "<script>…</script>";