내 함수 중 하나에서 QScriptEngine 연산을 최적화하려고합니다.QScriptEngine 반복 동작 최적화
이 함수의 이름은 executeCustomJSOperation
이며 여러 파일에서 동일한 JS 코드를 실행합니다. 그러나 각 파일은 $xmlData
이라는 전역 변수를 변경해야합니다. 기본 함수는 $xmlData
변수를 사용하여 XML 파일을 메모리에로드 한 다음 항상 동일한 자바 스크립트 코드 (jsString
)를 적용하여 javascript를 사용하여이 XML 파일을 편집합니다. 결국 $xmlData
변수가 편집 된 XML로 다시 업데이트됩니다.
각 XML 파일을 처리하는 for 루프보다 OpenMP parallel for
만을 사용하여 2.5 속도 향상을 얻었습니다. 하지만 지금은이 기능 속도를 더 향상시키기 위해 어떻게 진행해야할지 모르겠다.
// 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
}
}
당신은 더이 코드를 최적화 할 수 있습니다 생각하십니까 :
코드는 다음과 같다? 의심스러운 점이 있으면 물어보십시오.
감사! 시간과 관련된 변경 사항을 잠시 동안 업데이트하지 않았습니다. 당신이 제안한 것과 똑같이 썼습니다. 스레드 당 하나의 QScriptEngine 만 만들고 중복 코드를 루프 밖으로 옮겼습니다. 나는 측정을하지 않았지만 나는 더 빠름을 안다. QScriptProgram 팁을 시도했지만 성능에 큰 변화가 없다는 것을 알았습니다. QScriptProgram을 각 스레드가 사용하는 힙의 벡터에 할당하고 있습니다. 나는 또한'V8' JSengine을 사용한다고 믿는 새로운'QJSEngine'을 시도했지만 느린 결과를 얻었습니다. : | – RandomGuy