Джинт очень медленный со строками

В настоящее время я работаю над проектом, который требует поддержки JS (настоящая программа написана на C#), и использую Jint в качестве переводчика. Прежде чем приступить к дальнейшей работе, я провел базовый тест производительности, чтобы найти разницу между компилятором (например, Chrome V8) и интерпретатором. Я ожидал, что самое большее 50-кратное замедление, но то, что я нашел, было ближе к 600-кратному. V8 в Chrome занимал 60-100 мс, а Jint - 60-70 секунд.

Тесты, которые я использовал, были тестами Mozilla Dromaeo String - http://dromaeo.com/?dromaeo / http://dromaeo.com/tests/dromaeo-object-string.html, с несколькими небольшими изменениями, которые могли работать без использования DOM.

var sTime = new Date();
var startTest = function(){sTime = new Date();};
var test = function(name, fn){ fn(); };
var eTime = new Date();
var endTest = function(){eTime = new Date(); console.log(eTime.getTime() - sTime.getTime());};
var prep = function(fn){ fn(); };

Итак, мой вопрос: почему Jint в 600-1000 раз медленнее компиляции V8 / native? Действительно ли переводчики намного медленнее или это особый случай, когда Jint особенно медленный?

РЕДАКТИРОВАТЬ Я разместил свой тестовый код здесь: http://pastebin.com/R017KKvR

Кажется, что string.lastIndexOf проблема в том, что на прохождение теста уходит 24-26 секунд.

1 ответ

Я предполагаю, что вы используете Jint v2 или выше.

V8 всегда будет быстрее, почти во всех сценариях. Как вы упоминаете, вопрос действительно в том, насколько. В этом случае это может быть обусловлено двумя факторами:

  • насколько интерпретация влияет на время выполнения сценария
  • насколько хорошо и оптимизированы методы-прототипы String

Единственный способ ответить на этот вопрос - профилировать производительность выполняемого скрипта и понять, на что тратится время. Более простой первый подход может также отслеживать все различные сгруппированные вызовы методов, чтобы определить, может ли общее время прийти только от одного или двух из них.

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

Обновить

Исправлено с этим коммитом: https://github.com/sebastienros/jint/commit/2ed825cda866092c728b07a9e2b6109b0d20cbc8

Другие вопросы по тегам