Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 优化QScript引擎重复操作_Javascript_C++_Qt_Optimization_Qtscript - Fatal编程技术网

Javascript 优化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

我正在尝试在我的一个函数中优化QScript引擎操作

该函数名为
executeCustomJSOperation
,它在多个文件中执行相同的JS代码。但是,每个文件都需要更改名为
$xmlData
的全局变量。函数basicaly使用
$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
    }
}
//允许用户回显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,但我得到的结果要慢得多|