Comments 13
Моё почтение, если вы действительно пошли путём написании через wat.
Чтобы приблизиться к возможностям «железа»...
Я правильно понимаю что в результате получилось порядка 500MB/s? Это не больше 10% от возможностей железа.
Приблизиться, а не достичь.
Чтобы выжимать из железа максимум, нужно решать очень специфические задачи — матрицы перемножать, например. А на задачах «среднестатистических» упор много чаще происходит в слабую эффективность предсказания переходов в CPU, чем в предельную пропускную способность.
Даже в нашем примере CPU никак не может заранее сказать, какой из ключей ему встретится дальше в файле.
Чтобы выжимать из железа максимум, нужно решать очень специфические задачи — матрицы перемножать, например. А на задачах «среднестатистических» упор много чаще происходит в слабую эффективность предсказания переходов в CPU, чем в предельную пропускную способность.
Даже в нашем примере CPU никак не может заранее сказать, какой из ключей ему встретится дальше в файле.
удалено
складывать в хэшмэп со строковым ключом в процессе парсинга совершенно ни к чему, обычного массива более чем достаточноЭто очень сильное и некорректное допущение, которое слишком легко позволяет свести ситуацию к единственному .match из предыдущей статьи.
Еще момент — если нам надо не просто «пропарсить файл», а все-таки по ходу куда-то отдавать эти результаты в JS/any-other-lang, то сам вызов этих функций передачи добавит накладных расходов.
Удалил свой комментарий, потому что понял что решаю немного другую задачу — агрегирую результаты по нескольким строкам, а вы заворачиваете в скобочки каждую строку. Про отдавание результатов — ну так и вы их никуда не отдаёте. Давайте добавим вывод в stdout и посмотрим что произойдёт со скоростью?
Я имел в виду передачу результата из высокопроизводительного C-кода в JS. По условию задачи результат каждой строки нам нужен именно на JS-стороне.
По условию задачи результат каждой строки нам нужен именно на JS-стороне.
Ну так-то C может жить в том же процессе, что и JS. Например: создаём два буфера, в один пишем парсером, второй в это время обрабатывается обработчиком. Когда оба закончили (парсер забил данными весь свой буфер, а обработчик вычитал весь свой), меняемся буферами. Но ваша процедура последующей обработки на JS готова получать на вход пару ГБ данных в секунду?
Я не про межпроцессную передачу данных, а про передачу управления/контекста — каждый
В нашем случае контекст с объектом должен попасть в JS при окончании разбора строки — в целом, у нас задача «распарсить набор строк, некоторые из которых имеют такой вот формат, который разбирается относительно долго», а не «распарсить весь файл, а дальше уж как заберут». Поэтому после каждой строки надо отдавать результат.
Но идея с потоковым заполнением буфера, безусловно, здравая.
jmp/call
, да с обвязкой сохранения-наполнения стека — это дорого.В нашем случае контекст с объектом должен попасть в JS при окончании разбора строки — в целом, у нас задача «распарсить набор строк, некоторые из которых имеют такой вот формат, который разбирается относительно долго», а не «распарсить весь файл, а дальше уж как заберут». Поэтому после каждой строки надо отдавать результат.
Но идея с потоковым заполнением буфера, безусловно, здравая.
Sign up to leave a comment.
Разгоняем JS-парсер с помощью WebAssembly (часть 1: базовые возможности)