Я пытаюсь оптимизировать операции QScriptEngine в одной из своих функций.
Функция называется executeCustomJSOperation
и выполняет один и тот же код JS в нескольких файлах. Однако в каждом файле необходимо изменить глобальную переменную с именем $xmlData
. Функция загружает XML-файл в память с помощью переменной $xmlData
, а затем всегда применяет один и тот же код javascript (jsString
) для редактирования этого XML-файла с помощью javascript. В конце переменная $xmlData
снова обновляется отредактированным XML.
У меня есть ускорение 2.5, использующее только OpenMP parallel for
поверх цикла for, который обрабатывает каждый файл XML. Но теперь я не знаю, как поступить, чтобы улучшить скорость этой функции.
Код следующий:
// allows user to echo js variables to check them in terminal using cout
QScriptValue echo(QScriptContext *context, QScriptEngine *engine)
{
std::cout << context->argument(0).toString().toUtf8().constData() << std::endl;
return "";
}
void executeCustomJSOperation(const QString &jsString, const QStringList &filesToProcess){
QString rexmlString, jsxmlString;
QFile rexmlfile(":/resources/libs/rexml.js"); // load javascript libraries as strings to memory
QFile jsxmlfile(":/resources/libs/jsxml.js");
rexmlfile.open(QFile::ReadOnly | QFile::Text);
jsxmlfile.open(QFile::ReadOnly | QFile::Text);
rexmlString=QTextStream(&rexmlfile).readAll();
jsxmlString=QTextStream(&jsxmlfile).readAll();
// Process all XmlFiles
#pragma omp parallel for // 2.5 speedup in my pc
for(int i=0; i<filesToProcess.size(); i++){
QString currXmlFileString;
QScriptEngine engine;
QScriptValue engineResult;
// Add echo function so user can debug the code
QScriptValue echoFunction = engine.newFunction(echo);
engine.globalObject().setProperty("echo", echoFunction);
engine.evaluate(rexmlString); // load js libraries in js engine
engine.evaluate(jsxmlString);
QFile currXmlFile(filesToProcess[i]);
currXmlFileString=QTextStream(&currXmlFile).readAll();
currXmlFile.close(); // close reading
engine.globalObject().setProperty("$xmlData",currXmlFileString);
engine.evaluate("main(); function main() {"+jsString+"}"); // main function allows to use return to exit prematurely from user code
engineResult=engine.globalObject().property("$xmlData");
QTextStream(&currXmlFile) << engineResult.toString(); // retreive the modified xml by javascript and save it to the file
}
}
Как вы думаете, можно ли еще оптимизировать этот код? Если у вас есть какие-либо сомнения, пожалуйста, спросите.