0

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

该函数被命名executeCustomJSOperation,它在多个文件中执行相同的 JS 代码。但是,每个文件都需要更改一个名为$xmlData. 该函数基本上使用变量将 XML 文件加载到内存中$xmlData,然后始终应用相同的 javascript 代码 ( jsString) 来使用 javascript 编辑此 XML 文件。最后,$xmlData变量再次使用编辑过的 XML 更新。

parallel for在处理每个 XML 文件的 for 循环上,我只使用 OpenMP 就获得了 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
    }
}

您认为可以进一步优化此代码吗?如果您有任何疑问,请询问。

4

2 回答 2

1

为什么要为每次迭代创建/初始化一个单独的 QScriptEngine?我建议将所有内容移至您的位置

engine.evaluate(jsxmlString);

到外面for()-loop

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

当然,如果你的 JS 代码真的是单用的话,只有,QScriptProgram是你优化的唯一希望。同样,您设置了有限数量的工作线程,每个都有自己的QScriptProgramQScriptEngine每次迭代一个,如在您当前的代码中)。

于 2014-11-03T20:03:26.297 回答
1

您可以构造一个QScriptProgram,将所有 JS 代码放入其中并使用QScriptEngine::evaluate. 它可以加快执行速度,因为解析 JS 代码只会执行一次。但是,QScriptProgram它没有记录为可重入或线程安全的,因此即使每个线程都使用自己的QScriptProgram对象,您也不能确定它是否能在多个线程中正常工作。

于 2014-02-15T22:02:34.860 回答