ФорумПрограммированиеJavaScript → ES6 String template работает в последних версиях v8

ES6 String template работает в последних версиях v8

  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 3 мая 2015 г. 12:39

    Что это - Getting Literal With ES6 Template Strings - HTML5 Rocks [updates.html5rocks.com]

    В nodejs не работает, но прекрасно работает в iojs. В браузерах, если интересно, в последних Хромах и Фаерфоксах. ИЕ, вспомнил старую традицию и решил не баловать такими ништяками.

    Но, для тех, кто юзает iojs, и краснеет при работе со строками - самое то. Я прям пошёл переписывать всякие

    
    'хуй' + ' ' + 'пизда'
    ['джи', 'гур', 'да'].join('')
    

    Более того, я считаю это одним из самых важных введений в язык. class,proxy - это весело, const - это строго, а вот со строками надо было что-то делать ещё лет 20 назад...

  • Sinkler

    Сообщения: 9652 Репутация: N Группа: в ухо

    Spritz 3 мая 2015 г. 12:48, спустя 9 минут 28 секунд

    в coffeescript простенькая реализация этого давно радует

    author = "Wittgenstein"
    quote  = "A picture is a fact. -- #{ author }"
    

    Спустя 17 сек.

    но Tagged Templates - супер, конечно

  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 3 мая 2015 г. 15:20, спустя 2 часа 31 минуту 58 секунд

    Но реализация, в плане скорости пока печалит :(

    Накатал простенький бенчмарк:

    'use strict'
    
    const a = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
          b = 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb',
          c = 'ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
          d = 'ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd';
    
    let i, l;
    // pre loop
    for (i = 0, l = 1000*1000*1000; i < l; i++)
        a + b;
    
    console.time('concat');
    for (i = 0, l = 1000*1000*1000; i < l; i++)
        a + b + c + d;
    console.timeEnd('concat');
    
    console.time('template');
    for (i = 0, l = 1000*1000*1000; i < l; i++)
        `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa${ b }ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc${ d }`;
    console.timeEnd('template')

    concat: 971ms

    template: 12411ms

  • adw0rd

    Сообщения: 22900 Репутация: N Группа: в ухо

    Spritz 3 мая 2015 г. 15:23, спустя 2 минуты 45 секунд

    @mathete, пиши ещё

    adw/0
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 3 мая 2015 г. 15:47, спустя 23 минуты 36 секунд

    @adw0rd, да легко :)

    Решил ещё побенчмаркить. Для определения вхождения подстроки в строку, запилили в стандарт и в v8 New string features in ECMAScript 6 [2ality.com]

    Прям как в питонах.

    Заинтересовало сравнить с indexOf. includes примерно на равных идёт. А вот со startsWith что-то странное:

    // lng - long string
    console.time('indexOf');
    for (i = 0, l = 20*1000*1000; i < l; i++)
        lng.indexOf('Developers') === 0;
    console.timeEnd('indexOf');
    
    console.time('startsWith');
    for (i = 0, l = 20*1000*1000; i < l; i++)
        lng.startsWith('Developers');
    console.timeEnd('startsWith');

    indexOf: 1007ms

    startsWith: 1356ms

    35% это всё-таки много... Даже интересно посмотреть, как они умудрились это сделать?

    P.S. всё гонялось на iojs-v1.8.1-linux-x64 на ультрабуке с Mint17.1

  • adw0rd

    Сообщения: 22900 Репутация: N Группа: в ухо

    Spritz 3 мая 2015 г. 15:59, спустя 12 минут 9 секунд

    @mathete, про startswith смешно) привели код, если пойдёшь смотреть сорцы

    adw/0
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 4 мая 2015 г. 1:06, спустя 9 часов 7 минут 3 секунды

    @adw0rd, я заволновался, пошёл тоже самое проверил в питоне

    >>> timeit.timeit('"abcdefghhhuiop".startswith("a")', number=10000000)
    1.6059615989943268
    >>> timeit.timeit('"abcdefghhhuiop".index("a")==0', number=10000000)
    1.9248016959973029

    Т.е. наоборот startswith оптимизирован, по сравнению с общим методом.

    А вот форматинг

    >>> timeit.timeit('"aaaaaaaa" + "bbbbbbbb" + "cccccccc" + "dddddddd"', number=10000000)
    1.4305864760026452
    >>> timeit.timeit('"aaaaaaaa{}cccccccc{}".format("bbbbbbbb", "dddddddd")', number=10000000)
    3.3766148069989868

    Дело в том, что в ES6 сделали этот темплейтинг слишком навороченным. Это же посути eval с текущим скоупом внутри строки, а не форматинг. Писателям стандарта, было весело придумать {x+y} и {fn(x)}, но они не думали вообще над реализацией и производительностью.

    В итоге получили неюзабельную хуергу, которая к тому же противоречит прекрасному принципу - "в шаблонах не должно быть логики".

    Эйфория прошла, топик можно удалять.

  • adw0rd

    Сообщения: 22900 Репутация: N Группа: в ухо

    Spritz 4 мая 2015 г. 1:17, спустя 10 минут 48 секунд

    @mathete, по сути мы евалить и так могли, так что ты прав, надо было им делать скромнее, как в Питоне, либо классический как в си (printf)

    adw/0
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 4 мая 2015 г. 1:17, спустя 51 секунду

    @mathete, про startswith смешно) привели код, если пойдёшь смотреть сорцы

    @adw0rd, меня не остановить :)

    v8/v8 [github.com]

    И опять - стандарт против производительности. Сначала идёт проверка на регексп, потом ковыряния с опциональным position (кстати, нахуя он?) и в итоге, ожидаемое:

    return %StringIndexOf(s, ss, start) === start;
  • vasa_c

    Сообщения: 3127 Репутация: N Группа: в ухо

    Spritz 4 мая 2015 г. 2:10, спустя 53 минуты

    Всяким парсерам и компрессорам это усложнит жизнь многократно.

  • adw0rd

    Сообщения: 22900 Репутация: N Группа: в ухо

    Spritz 4 мая 2015 г. 3:52, спустя 1 час 41 минуту 58 секунд

    @mathete, тоже посмотрел сорцы, про pos не понятно, про регексп тоже. Будем юзать indexOf

    adw/0
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 4 мая 2015 г. 9:46, спустя 5 часов 53 минуты 44 секунды

    "в шаблонах не должно быть логики".

    @mathete, а как тогда отрисовывать деревья без логики в шаблонах?

    не всё полезно, что в swap полезло
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 4 мая 2015 г. 11:17, спустя 1 час 30 минут 36 секунд

    "в шаблонах не должно быть логики".

    @mathete, а как тогда отрисовывать деревья без логики в шаблонах?

    @master, я не знаю что именно ты имеешь в виду, но там не управиться циклом?

    Я имел в виду, классическое разделение логики и представления. Вот внятное описание Язык шаблонов Django — Документация Django 1.7 [djbook.ru]

    Если у вас есть опыт программирования или вы использовали PHP, который позволяет интегрировать программный код прямо HTML, вам стоит помнить, что система шаблонов Django – это не просто Python встроенный в HTML. Это сделано намеренно: шаблоны предназначены для представления, а не для реализации логики программы.

    Шаблоны Django предоставляют теги, которые повторяют некоторые структуры языка программирования – тег if для проверки на истинность, тег for для циклов, и др. – но они не выполняются непосредственно как код Python, и система шаблонов не будет выполнять произвольное выражение Python. Только теги, фильтры и синтаксис, перечисленные ниже, поддерживаются по умолчанию (хотя вы можете добавить собственное расширение для языка шаблонов при необходимости).

  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 4 мая 2015 г. 21:06, спустя 9 часов 49 минут 24 секунды

    @mathete, я имею ввиду рекурсию, для которой нужно создавать функцию ОтрисоватьНоду

    не всё полезно, что в swap полезло
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 5 мая 2015 г. 0:37, спустя 3 часа 30 минут 20 секунд

    @master, рекурсия в шаблонах создаётся инклюдингом этого же шаблона. В шаблоне представление текущей ноды и цикл по детям, если говорим про дерево, на каждое дитя инклюд этого же шаблона.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!