History

Add initial benchmarks for the script engine

Dale Glass committed 3 years ago

Commit bf7a0c61 parent 3abd98b2 files · +237 −0Browse files

Showing the changes to tests/script-engine/src/ScriptEngineBenchmarkTests.cpp (1 of 2 files). Show all

Unified · Split

tests/script-engine/src/ScriptEngineBenchmarkTests.cpp+201−0
@@ -0,0 +1,201 @@
1+//
2+// Copyright 2023 Overte e.V.
3+//
4+// Distributed under the Apache License, Version 2.0.
5+// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
6+// SPDX-License-Identifier: Apache-2.0
7+//
8+
9+#include <QSignalSpy>
10+#include <QDebug>
11+#include <QFile>
12+#include <QTextStream>
13+
14+
15+#include "ScriptEngineBenchmarkTests.h"
16+#include "DependencyManager.h"
17+
18+#include "ScriptEngines.h"
19+#include "ScriptEngine.h"
20+#include "ScriptCache.h"
21+#include "ScriptManager.h"
22+
23+#include "v8/ScriptObjectV8Proxy.h"
24+#include "v8/ScriptEngineV8.h"
25+
26+#include "ResourceManager.h"
27+#include "ResourceRequestObserver.h"
28+#include "StatTracker.h"
29+
30+#include "NodeList.h"
31+#include "../../../libraries/entities/src/EntityScriptingInterface.h"
32+//#include "../../../libraries/entities/src/EntityScriptingInterface.h"
33+
34+QTEST_MAIN(ScriptEngineBenchmarkTests)
35+
36+
37+
38+
39+
40+
41+void ScriptEngineBenchmarkTests::initTestCase() {
42+ // AudioClient starts networking, but for the purposes of the tests here we don't care,
43+ // so just got to use some port.
44+ //int listenPort = 10000;
45+
46+ //DependencyManager::registerInheritance<LimitedNodeList, NodeList>();
47+ //DependencyManager::set<NodeList>(NodeType::Agent, listenPort);
48+ DependencyManager::set<ScriptEngines>(ScriptManager::NETWORKLESS_TEST_SCRIPT, QUrl(""));
49+ DependencyManager::set<ScriptCache>();
50+ // DependencyManager::set<ResourceManager>();
51+ // DependencyManager::set<ResourceRequestObserver>();
52+ DependencyManager::set<StatTracker>();
53+ DependencyManager::set<ScriptInitializers>();
54+ // DependencyManager::set<EntityScriptingInterface>(true);
55+
56+
57+}
58+
59+ScriptManagerPointer ScriptEngineBenchmarkTests::makeManager(const QString &scriptSource, const QString &scriptFilename) {
60+ ScriptManagerPointer sm = newScriptManager(ScriptManager::NETWORKLESS_TEST_SCRIPT, scriptSource, scriptFilename);
61+
62+
63+ sm->setAbortOnUncaughtException(true);
64+
65+ connect(sm.get(), &ScriptManager::scriptLoaded, [](const QString& filename){
66+ qWarning() << "Loaded script" << filename;
67+ });
68+
69+
70+ connect(sm.get(), &ScriptManager::errorLoadingScript, [](const QString& filename){
71+ qWarning() << "Failed to load script" << filename;
72+ });
73+
74+ connect(sm.get(), &ScriptManager::printedMessage, [](const QString& message, const QString& engineName){
75+ qDebug() << "Printed message from engine" << engineName << ": " << message;
76+ });
77+
78+ connect(sm.get(), &ScriptManager::infoMessage, [](const QString& message, const QString& engineName){
79+ qInfo() << "Info message from engine" << engineName << ": " << message;
80+ });
81+
82+ connect(sm.get(), &ScriptManager::warningMessage, [](const QString& message, const QString& engineName){
83+ qWarning() << "Warning from engine" << engineName << ": " << message;
84+ });
85+
86+ connect(sm.get(), &ScriptManager::errorMessage, [](const QString& message, const QString& engineName){
87+ qCritical() << "Error from engine" << engineName << ": " << message;
88+ });
89+
90+ connect(sm.get(), &ScriptManager::finished, [](const QString& fileNameString, ScriptManagerPointer smp){
91+ qInfo() << "Finished running script" << fileNameString;
92+ });
93+
94+ connect(sm.get(), &ScriptManager::runningStateChanged, [sm](){
95+ qInfo() << "Running state changed. Running = " << sm->isRunning() << "; Stopped = " << sm->isStopped() << "; Finished = " << sm->isFinished();
96+ });
97+
98+ connect(sm.get(), &ScriptManager::unhandledException, [](std::shared_ptr<ScriptException> exception){
99+ qWarning() << "Exception from engine: " << exception;
100+ });
101+
102+
103+ return sm;
104+}
105+
106+void ScriptEngineBenchmarkTests::benchmarkSetProperty() {
107+ auto sm = makeManager("print(\"script works!\"); Script.stop(true);", "testTrivial.js");
108+
109+ auto engine = sm->engine();
110+ auto obj = engine->newObject();
111+
112+ QBENCHMARK {
113+ engine->setProperty("hello", QVariant(1));
114+ }
115+
116+
117+}
118+
119+void ScriptEngineBenchmarkTests::benchmarkSetProperty1K() {
120+ auto sm = makeManager("print(\"script works!\"); Script.stop(true);", "testTrivial.js");
121+
122+ auto engine = sm->engine();
123+ auto obj = engine->newObject();
124+
125+ int i = 0;
126+ char buf[128];
127+
128+ QBENCHMARK {
129+ for(i=0;i<1024;i++) {
130+ sprintf(buf, "%i", i);
131+ engine->setProperty(buf, QVariant(1));
132+ }
133+ }
134+
135+
136+}
137+
138+void ScriptEngineBenchmarkTests::benchmarkSetProperty16K() {
139+ auto sm = makeManager("print(\"script works!\"); Script.stop(true);", "testTrivial.js");
140+
141+ auto engine = sm->engine();
142+ auto obj = engine->newObject();
143+
144+ int i = 0;
145+ char buf[128];
146+
147+ QBENCHMARK {
148+ for(i=0;i<16384;i++) {
149+ sprintf(buf, "%i", i);
150+ engine->setProperty(buf, QVariant(1));
151+ }
152+ }
153+
154+
155+}
156+
157+
158+void ScriptEngineBenchmarkTests::benchmarkQueryProperty() {
159+ auto sm = makeManager("print(\"script works!\"); Script.stop(true);", "testTrivial.js");
160+
161+ auto engine = sm->engine();
162+ auto obj = engine->newObject();
163+
164+
165+
166+ int i = 0;
167+ char buf[128];
168+
169+ QObject dummy;
170+
171+ ScriptEngineV8 *v8_engine = dynamic_cast<ScriptEngineV8*>(engine.get());
172+
173+ ScriptObjectV8Proxy proxy(v8_engine, &dummy, false, ScriptEngine::QObjectWrapOptions());
174+
175+ for(i=0;i<16384;i++) {
176+ sprintf(buf, "%i", i);
177+ engine->setProperty(buf, QVariant(1));
178+ }
179+
180+ QSKIP("Test not implemented yet");
181+
182+// QBENCHMARK {
183+// engine->property()
184+// }
185+
186+}
187+
188+
189+void ScriptEngineBenchmarkTests::benchmarkSimpleScript() {
190+
191+ QBENCHMARK {
192+ auto sm = makeManager("print(\"script works!\"); Script.stop(true);", "testTrivial.js");
193+ QString printed;
194+ connect(sm.get(), &ScriptManager::printedMessage, [&printed](const QString& message, const QString& engineName){
195+ printed.append(message);
196+ });
197+
198+ sm->run();
199+ }
200+
201+}