gpt4 book ai didi

javascript - 使用 QJSEngine 在 Qt 中执行 Javascript 的速度

转载 作者:太空宇宙 更新时间:2023-11-04 13:11:07 24 4
gpt4 key购买 nike

背景:我在一个需要以下内容的项目中工作:用户可以编写命令来使用主程序(用 Qt/C++ 编写的 GUI)的内部变量执行一些数学运算。

我的方法是一个文本框,用户可以在其中用 JavaScript 编写命令/脚本,然后 Qt 评估该代码。为此,我正在使用 QJSEngine

问题:JavaScript 的计算速度很差/很慢。

例如,我们有一个只有两个文本框 (QTextEdit) 和一个按钮的 GUI。用户在一个文本框中编写 JavaScript 代码,当按下按钮时对其进行计算,结果显示在另一个文本框中。

作为性能不佳的一个例子,当用户编写这个简单的 JavaScript 代码时,计算机会花费大约 3 秒来显示答案:

var X = [];
for (var i=0 ; i < 934600 ; ++i )
{
X[i] = i;
}
X[120]

另一方面,如果在Qt/C++中进行同样的操作,则是“瞬时”的:

QVector<double> myVec;
for(int i=0; i < 934600; ++i)
{
myVec.append(i);
}
qDebug() << myVec.value(120);

我知道JavaScript是一种解释型语言,但是这样的表现正常吗?

这里有一个小的 Qt 示例程序 (pr_Parser) 来说明这个问题。我已经在 Qt Creator 4.0.1 中对此进行了测试。使用 Qt 5.7 MSVC2013 64 位。

谢谢。

pr_parser.pro

QT       += core gui qml    
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = pr_Parser
TEMPLATE = app
CONFIG += c++11
SOURCES += main.cpp\
CMainWindow.cpp
HEADERS += CMainWindow.h

main.cpp

#include "CMainWindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
CMainWindow w;
w.show();
return a.exec();
}

CMainWindow.h

#include <QMainWindow>
class QPlainTextEdit;
class CMainWindow : public QMainWindow
{
Q_OBJECT

public:
CMainWindow(QWidget *parent = 0);
~CMainWindow();
private:
QPlainTextEdit *m_p_myScriptWindow;
QPlainTextEdit *m_p_myResultWindow;
private slots:
void slot_ExecuteScript();
};

CMainWindow.cpp

#include "CMainWindow.h"
#include <QtWidgets>
#include <QJSEngine>

CMainWindow::CMainWindow(QWidget *parent)
: QMainWindow(parent)
{
QWidget *window = new QWidget(this);
setCentralWidget(window);
QString sampleScript = "var X = [];";
sampleScript.append("for (var i=0 ; i < 934600 ; ++i ){X[i]=i;}");
sampleScript.append("X[120]");
m_p_myScriptWindow = new QPlainTextEdit(sampleScript, this);
m_p_myResultWindow = new QPlainTextEdit(this);
QPushButton *myButton = new QPushButton("Execute", this);
QVBoxLayout *myLayout = new QVBoxLayout(this);
myLayout->addWidget(m_p_myScriptWindow);
myLayout->addWidget(myButton);
myLayout->addWidget(m_p_myResultWindow);
window->setLayout(myLayout);
connect(myButton, SIGNAL(clicked()), this, SLOT(slot_ExecuteScript()));
}

CMainWindow::~CMainWindow(){}

void CMainWindow::slot_ExecuteScript()
{
QJSEngine myEngine;
QString myScript = m_p_myScriptWindow->toPlainText();
QJSValue myValue = myEngine.evaluate(myScript);
if(myValue.isError())
{
m_p_myResultWindow->setPlainText(myValue.property("message").toString());
}
else
{
m_p_myResultWindow->setPlainText(myValue.toString());
}

// This code is "instanteneous"
// QVector<double> myVec;
// for(int i=0; i < 934600; ++i) {myVec.append(i);}
// m_p_myResultWindow->setPlainText(QString::number(myVec.value(120)));
}

最佳答案

我找到了答案。

问题是我在 Debug模式下编译它。在 Release模式下快 10 倍。

测量的时间(使用 QElapsedTimer)执行了几次:

JavaScript 脚本:

  • 在 Debug模式下:2900 - 3000 毫秒
  • 在 Release模式中:255 - 300 毫秒

原生 Qt/C++ 中的相同“for”:

  • 在 Debug模式下:26 - 29 毫秒
  • 在 Release模式下:7 - 6 毫秒

关于javascript - 使用 QJSEngine 在 Qt 中执行 Javascript 的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39868306/

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