diff options
Diffstat (limited to 'lib/LuaBridge/Tests/Source/PerformanceTests.cpp')
-rw-r--r-- | lib/LuaBridge/Tests/Source/PerformanceTests.cpp | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/lib/LuaBridge/Tests/Source/PerformanceTests.cpp b/lib/LuaBridge/Tests/Source/PerformanceTests.cpp new file mode 100644 index 0000000..bb074ac --- /dev/null +++ b/lib/LuaBridge/Tests/Source/PerformanceTests.cpp @@ -0,0 +1,165 @@ +//============================================================================== +// https://github.com/vinniefalco/LuaBridge +// +// Copyright 2012, Vinnie Falco <vinnie.falco@gmail.com> +// Copyright 2007, Nathan Reed +// SPDX-License-Identifier: MIT + +#include "TestBase.h" + +#include "JuceLibraryCode/BinaryData.h" + +/** + Command line version of LuaBridge test suite. +*/ + +#include <cstdio> +#include <iostream> +#include <iomanip> +#include <string> +#include <vector> +#include <ctime> + +using namespace std; +using namespace luabridge; + +//------------------------------------------------------------------------------ +/** + Simple stopwatch for measuring elapsed time. +*/ +class Stopwatch +{ +private: + clock_t m_start; + +public: + Stopwatch () + { + start (); + } + + void start () + { + m_start = clock (); + } + + double getElapsedSeconds () + { + clock_t now; + + now = clock (); + + return (double (now - m_start)) / CLOCKS_PER_SEC; + } +}; + +//------------------------------------------------------------------------------ +/** + Classes used for performance tests. +*/ + +struct A +{ + A () : data (0), prop (0) + { + } + + void mf1 () + { + } + + void mf2 (A*) + { + } + + void mf3 (A&) + { + } + + virtual void vf1 () + { + } + + int data; + + int prop; + int getprop () const + { + return prop; + } + void setprop (int v) + { + prop = v; + } +}; + +//------------------------------------------------------------------------------ + +void addToState (lua_State* L) +{ + getGlobalNamespace (L) + .beginClass <A> ("A") + .addConstructor <void (*)(void)> () + .addFunction ("mf1", &A::mf1) + .addFunction ("mf2", &A::mf2) + .addFunction ("mf3", &A::mf3) + .addFunction ("vf1", &A::vf1) + .addData ("data", &A::data) + .addProperty ("prop", &A::getprop, &A::setprop) + .endClass () + ; +} + +void runTests (lua_State* L) +{ + cout.precision (4); + + int result; + + luaL_dostring (L, "a = A()"); + + int const trials = 5; + + for (int trial = 0; trial < trials; ++trial) + { + result = luaL_loadstring (L, "a:mf1 ()"); + if (result != 0) + lua_error (L); + + int const N = 10000000; + + Stopwatch sw; + + sw.start (); + for (int i = 0; i < N; ++i) + { + lua_pushvalue (L, -1); + lua_call (L, 0, 0); + } + + double const seconds = sw.getElapsedSeconds (); + + cout << "Elapsed time: " << seconds << endl; + } +} + +void runPerformanceTests () +{ + lua_State* L = luaL_newstate (); + luaL_openlibs (L); + + addToState (L); + runTests (L); + + lua_close (L); +} + +struct PerformanceTests : TestBase +{ +}; + +TEST_F (PerformanceTests, AllTests) +{ + addToState (L); + runTests (L); +} |