Вход

Просмотр полной версии : Оптимизация работы со строкой-буфером


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
Скрипт нацелен на использование в NodeJS, хотя под браузеры тож рассчитан (но там оптимизация не нужна)
посмотри http://nodejs.org/api/buffer.html , возможно, оно самое.

mta88
16.08.2013, 16:22
Скрипт нацелен на использование в NodeJS

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

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

danik.js
16.08.2013, 16:59
вам придется делать так --->
Я бы давно так сделал, ибо 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)