gpt4 book ai didi

javascript - 优化 QScriptEngine 重复 Action

转载 作者:行者123 更新时间:2023-11-28 02:56:46 24 4
gpt4 key购买 nike

我正在尝试优化我的一个函数中的 QScriptEngine 操作。

函数名为executeCustomJSOperation,它在多个文件中执行相同的JS代码。但是,每个文件都需要更改名为 $xmlData 的全局变量。该函数基本上使用 $xmlData 变量将 XML 文件加载到内存中,然后始终应用相同的 javascript 代码 (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?我建议将所有内容都移到你的行上

engine.evaluate(jsxmlString);

for() 循环 之外。

是的,这会使 WRT 线程化变得更加困难。本质上,您必须设置 n 个工作线程,并为每个线程(而不是每个文件)创建一个脚本引擎。对于初学者来说,一个简单的单线程版本应该让您初步了解预期的加速效果,以及是否值得为此付出努力。

当然,如果你的JS代码真的是单次使用的,只有QScriptProgram才是你优化的唯一希望。同样,您将设置有限数量的工作线程,每个工作线程都有自己的 QScriptProgram(和一个 QScriptEngine,就像您当前的代码一样,每次迭代)。

关于javascript - 优化 QScriptEngine 重复 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21798970/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com