Может ли Rhino автоматически оптимизировать скрипты, как это делает Node.js? - PullRequest
3 голосов
/ 25 июня 2019

Я хотел протестировать различные способы поиска по тексту и их влияние на время.Для этого я написал следующее:

// test case 1: no regex instance & regex.exec
let t1total = 0;
for (let j = 0; j < trialCount; j++){
    let start = performance.now();
    for (let i = 0; i < splitLog.length; i++) {
        /^([A-Z]+)[^\d]+([\d\/\-.:]+\sUTC)/.exec(splitLog[i]);
    }
    let end = performance.now();
    t1total += end - start
}
t1total /= trialCount;

// test case 2: pre-compile + regex.exec
let t2total = 0;
let compileStart = performance.now();
const preRegex = new RegExp(/^([A-Z]+)[^\d]+([\d\/\-.:]+\sUTC)/);
let compileEnd = performance.now();
t2total += compileEnd - compileStart;
for (let j = 0; j < trialCount; j++){
    let start = performance.now();
    for (let i = 0; i < splitLog.length; i++) {
        preRegex.exec(splitLog[i]);
    }
    let end = performance.now();
    t2total += end - start
}
t2total /= trialCount;

Я хотел выполнить это во многих испытаниях и взять среднее значение, чтобы получить более последовательный результат, но понял, что узел автоматически оптимизирует такую ​​ситуацию.

Результаты в мс для 1 испытания: Test 1: no regex instance + regex.exec 9.151600003242493 Test 2: pre-compile + regex.exec 4.707100033760071

Результаты в мс для 1000 испытаний: Test 1: no regex instance + regex.exec 2.340533686041832 Test 2: pre-compile + regex.exec 2.199146592259407

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

Теперь представьте себе скрипт, в котором exec вызывается только один раз для регулярного выражения, которое не было создано.Будет ли Rhino многократно вызывать такой скрипт для оптимизации, аналогичной узлу, выполняющему цикл, подобный тестовому примеру 1?

Другими словами, оптимизирует ли Rhino повторный вызов сценария, который создает регулярное выражение, подобно тому, как nodejs оптимизирует многократное создание экземпляровтот же регулярное выражение?

1 Ответ

1 голос
/ 26 июня 2019

Я провел несколько тестов, чтобы попытаться выяснить это, и похоже, что подобная автоматическая оптимизация действительно похожа, но между разными методами есть заметная разница - в отличие от моих результатов с Node.js.

Trials : 1
Lines: 35629
Regex compile time:  111859500

no instance + exec:  196013300
precompile + exec:   127519700
no instance + match: 116066300
precompile + match:  68303500
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Trials: 1000
Lines: 35629
Regex compile time:  99829400

no instance + exec:  40101506
precompile + exec:   37426255
no instance + match: 45371233
precompile + match:  44917744

Странно то, что мои результаты действительно сильно меняются в зависимости от количества проведенных испытаний.Кроме того, повторное создание сценариев, кажется, прерывает эту оптимизацию.Полные результаты можно найти здесь .

Я создал «предварительно скомпилированное» регулярное выражение, скомпилировав регулярное выражение в сценарии, а затем вытянув его в объект Java.Затем я передал бы этот объект в качестве аргумента сценариям, которым для выполнения поиска требовалось уже скомпилированное регулярное выражение.

Примечание. Результаты отображаются только в тех случаях, когда сценарии, выполняющие поиск, не включают время create регулярное выражение или сами сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...