Javascript 优化QScript引擎重复操作
我正在尝试在我的一个函数中优化QScript引擎操作 该函数名为Javascript 优化QScript引擎重复操作,javascript,c++,qt,optimization,qtscript,Javascript,C++,Qt,Optimization,Qtscript,我正在尝试在我的一个函数中优化QScript引擎操作 该函数名为executeCustomJSOperation,它在多个文件中执行相同的JS代码。但是,每个文件都需要更改名为$xmlData的全局变量。函数basicaly使用$xmlData变量将XML文件加载到内存中,然后始终应用相同的javascript代码(jsString)使用javascript编辑此XML文件。最后,$xmlData变量将再次使用已编辑的XML进行更新 我只在处理每个XML文件的for循环上使用OpenMPpara
executeCustomJSOperation
,它在多个文件中执行相同的JS代码。但是,每个文件都需要更改名为$xmlData
的全局变量。函数basicaly使用$xmlData
变量将XML文件加载到内存中,然后始终应用相同的javascript代码(jsString
)使用javascript编辑此XML文件。最后,$xmlData
变量将再次使用已编辑的XML进行更新
我只在处理每个XML文件的for循环上使用OpenMPparallel 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
}
}
//允许用户回显js变量,以便使用cout在终端中检查它们
QScript值回显(QScript上下文*上下文,QScript引擎*引擎)
{
std::cout参数(0).toString().toUtf8().constData()您可以构造一个QScriptProgram
,将所有JS代码放入其中,并使用QScriptEngine::evaluate
对其进行评估。它可以加快执行速度,因为解析JS代码只需执行一次。但是,QScriptProgram
没有作为可重入或线程安全的文档记录,因此您无法确保它在mu中正常工作多个线程,即使每个线程使用自己的QScriptProgram
对象。为什么要为每个迭代创建/初始化一个单独的QScriptEngine?我建议将所有内容移动到您的行中
engine.evaluate(jsxmlString);
到()循环的外部
诚然,这将使WRT线程处理变得更加困难。实际上,您必须设置n个工作线程,并为每个线程(而不是每个文件)创建一个脚本引擎。对于初学者,简单的单线程版本应该让您首先了解预期的加速效果,以及这是否值得
当然,如果你的JS代码真的是一次性的,那么,QScriptProgram
是你优化的唯一希望。同样,你应该设置有限数量的工作线程,每个线程都有自己的QScriptProgram
(和当前代码一样,每次迭代一个QScriptEngine
).嗨,谢谢你的提示。我已经尝试过了,但是我无法用它来提高(cpu)性能。正如你所说的QScriptProgram
不是线程安全的,所以我不能只在线程中使用它,除非我为每个线程使用一个,在创建js后解析js。我也尝试过使用相同的对象(包括qengine和QScriptProgram)对于所有线程,为此,我尝试了一些同步方法,如omp critical、qmutex和EnterCriticalSection,但它们会使程序速度过慢。到目前为止,最快的实现仍然是我发布的每个线程都有单独的引擎/变量的实现。尝试从JS代码创建一个QScript程序
,然后创建服务器所有副本(应该很便宜)并将它们分发给所有线程。不幸的是,该选项似乎对线程也不起作用。我使用该方法时出现分段错误。似乎构造函数qscript程序::QScriptProgram(const QScriptProgram&other)
不制作QScript程序的深度副本。您可以检查实现的代码。请注意,此代码包括完整的代码,而不仅仅是我在此处发布的简化代码(例如包括错误检查)。谢谢!我已经有一段时间没有用我随时间所做的更改更新这个问题了。我完全按照您的建议编写了,我只为每个线程创建了一个QScriptEngine
,并将多余的代码移出循环。我没有进行测量,但我知道速度更快。我已经尝试了QScriptProgram
技巧,但是我没有注意到性能有任何显著的变化,我在堆中的一个向量中分配QScript程序,每个位置都由每个线程使用。我还尝试了新的QJSEngine
,我相信它使用V8
JSengine,但我得到的结果要慢得多|