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
34QTEST_MAIN(ScriptEngineBenchmarkTests)
35
36
37
38
39
40
41void 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
59ScriptManagerPointer 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
106void 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
119void 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
138void 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
158void 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
189void 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}