Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Оптимизация работы со строкой-буфером (https://javascript.ru/forum/misc/40705-optimizaciya-raboty-so-strokojj-buferom.html)

danik.js 16.08.2013 10:12

Оптимизация работы со строкой-буфером
 
Оптимизирую парсер (html5 парсер). Парсер работает посимвольно.
Токенизер в своей работе активно использует строку-буфер для накопления значения, к примеру имени тега, или атрибута. То есть в процессе работы часто используется такой код:

this.buffer += char;

В Java (да и в других типизиированных языках) буфер создается так:

this.buffer = new char[1024];

То есть выделили участок памяти определенной длины и далее просто записываем в него символы последовательно.

В JS же по идее мы создали пустую строку нулевой длины:
this.buffer = "";

И при последующей записи символов место под строку всякий раз выделяется новое (как я думаю), что тормозит работу.

Вопрос: так ли это? Или интерпретатор сам оптимизирует этот процесс, выделяя под строку место с запасом?

И если ручная оптимизация требуется, то как ее лучше произвести?
Пытался заменить строку на массив определенной длины:
this.buffer = new Array(1024);
но это только существенно замедлило работу (не понимаю почему). И это еще без учета конвертации такого массива обратно в строку.

В общем кто знает, прошу помощи.

Скрипт нацелен на использование в NodeJS, хотя под браузеры тож рассчитан (но там оптимизация не нужна)

Яростный Меч 16.08.2013 15:20

Цитата:

Сообщение от danik.js
Скрипт нацелен на использование в NodeJS, хотя под браузеры тож рассчитан (но там оптимизация не нужна)

посмотри http://nodejs.org/api/buffer.html , возможно, оно самое.

mta88 16.08.2013 16:22

Цитата:

Скрипт нацелен на использование в NodeJS
буквально на днях google открыл код своего парсера html5 на C -- github.com/google/gumbo-parser
и кто-то уже начал ваять node-обертку для него -- github.com/karlwestin/node-gumbo-parser -- уже версия 0.0.3 :)

вам придется делать так ---> :cray: :cray: :cray:

danik.js 16.08.2013 16:59

Цитата:

Сообщение от mta88
вам придется делать так --->

Я бы давно так сделал, ибо Mozilla давным давно выложили исходники своего парсера на Java (они транслируют его в C++ для использования в Firefox): https://bitbucket.org/validator/htmlparser/

Как раз эти исходники (java) я и преобровываю в js.

Обертка мне не подходит. Во-первых, не удобно пользоваться внутренними компонентами (если вообще возможно), во-вторых, мне нужна возможность запуска в браузере. Emscripten - слишком жирный вариант.
В последствии я планирую предложить парсер в модуль jsdom, но для начала нужно увеличить до максимума производительность.

Цитата:

Сообщение от Яростный Меч
посмотри http://nodejs.org/api/buffer.html , возможно, оно самое.

Попробовал. Что-то совсем стало тормозить (общее время увеличилось в 5 раз)

danik.js 16.08.2013 17:19

Цитата:

Сообщение от Дзен-трансгуманист
Действительно, зачем тогда тут Array, бери сразу Uint16Array или Buffer. (хотя лично я юзал SlowBuffer напрямую).

Имелось ввиду что все должно работать и в браузере, но производительность требуется только в V8 (для node.js)


Часовой пояс GMT +3, время: 16:30.