Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin")
# Add the subdirectories
add_subdirectory(CxxTestDesignPatternsUsingRTL)
add_subdirectory(CxxRTLTypeRegistration)
add_subdirectory(CxxRTLTestApplication)
add_subdirectory(RTLTestRunApp)
add_subdirectory(RTLBenchmarkApp)
add_subdirectory(CxxTestProps)
add_subdirectory(CxxTestUtils)
add_subdirectory(ReflectionTemplateLib)
38 changes: 0 additions & 38 deletions CxxRTLTestApplication/CMakeLists.txt

This file was deleted.

1 change: 1 addition & 0 deletions MyReflection.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"function": "getMagnitude","namespace": "complex","functorId": [{"containerId": "35","index": "8","returnId": "46","hash_code": "358046","signature": "d (std::nullptr_t)"}]},{"function": "setImaginary","namespace": "complex","functorId": [{"containerId": "45","index": "1","returnId": "17","hash_code": "451017","signature": "void (d)"}]},{"function": "setReal","namespace": "complex","functorId": [{"containerId": "45","index": "0","returnId": "17","hash_code": "450017","signature": "void (d)"}]},{"function": "getComplexNumAsString","functorId": [{"containerId": "35","index": "7","returnId": "3","hash_code": "35703","signature": "std::string (std::nullptr_t)"}]},{"function": "reverseString","functorId": [{"containerId": "35","index": "6","returnId": "3","hash_code": "35603","signature": "std::string (std::nullptr_t)"}, {"containerId": "44","index": "0","returnId": "3","hash_code": "44003","signature": "std::string (std::string)"}, {"containerId": "36","index": "1","returnId": "3","hash_code": "36103","signature": "std::string (PKc)"}]},{"method": "reset","namespace": "nsdate","record": "Event","functorId": [{"containerId": "22","index": "2","recordId": "15","returnId": "17","hash_code": "2221517","signature": "void N6nsdate5EventE::(std::nullptr_t)"}]},{"method": "Event::Event()","namespace": "nsdate","record": "Event","functorId": [{"containerId": "18","index": "1","recordId": "15","returnId": "15","hash_code": "1811515","signature": "N6nsdate5EventE::(N3rtl5allocE)"}]},{"method": "getTheDate","namespace": "nsdate","record": "Calender","functorId": [{"containerId": "22","index": "6","recordId": "16","returnId": "14","hash_code": "2261614","signature": "N6nsdate4DateE N6nsdate8CalenderE::(std::nullptr_t)"}]},{"method": "getSavedDate","namespace": "nsdate","record": "Calender","functorId": [{"containerId": "22","index": "8","recordId": "16","returnId": "14","hash_code": "2281614","signature": "N6nsdate4DateE N6nsdate8CalenderE::(std::nullptr_t)"}]},{"method": "getTheEvent","namespace": "nsdate","record": "Calender","functorId": [{"containerId": "22","index": "5","recordId": "16","returnId": "15","hash_code": "2251615","signature": "N6nsdate5EventE N6nsdate8CalenderE::(std::nullptr_t)"}]},{"method": "getSavedEvent","namespace": "nsdate","record": "Calender","functorId": [{"containerId": "22","index": "7","recordId": "16","returnId": "15","hash_code": "2271615","signature": "N6nsdate5EventE N6nsdate8CalenderE::(std::nullptr_t)"}]},{"method": "create","namespace": "nsdate","record": "Calender","functorId": [{"containerId": "35","index": "4","recordId": "16","returnId": "16","hash_code": "3541616","signature": "N6nsdate8CalenderE (std::nullptr_t)"}]},{"method": "Calender::Calender()","namespace": "nsdate","record": "Calender","functorId": [{"containerId": "18","index": "8","recordId": "16","returnId": "16","hash_code": "1881616","signature": "N6nsdate8CalenderE::(N3rtl5allocE)"}]},{"method": "getAsString","namespace": "nsdate","record": "Date","functorId": [{"containerId": "28","index": "0","recordId": "14","returnId": "3","hash_code": "280143","signature": "std::string N6nsdate4DateE::(std::nullptr_t) const"}]},{"method": "updateDate","namespace": "nsdate","record": "Date","functorId": [{"containerId": "20","index": "3","recordId": "14","returnId": "17","hash_code": "2031417","signature": "void N6nsdate4DateE::(std::string)"}]},{"method": "Date::Date()","namespace": "nsdate","record": "Date","functorId": [{"containerId": "18","index": "2","recordId": "14","returnId": "14","hash_code": "1821414","signature": "N6nsdate4DateE::(N3rtl5allocE)"}, {"containerId": "25","index": "0","recordId": "14","returnId": "14","hash_code": "2501414","signature": "N6nsdate4DateE::(N3rtl5allocE, std::string)"}, {"containerId": "26","index": "0","recordId": "14","returnId": "14","hash_code": "2601414","signature": "N6nsdate4DateE::(N3rtl5allocE, j, j, j)"}]},{"method": "empty","namespace": "std","record": "string","functorId": [{"containerId": "28","index": "5","recordId": "3","returnId": "9","hash_code": "28539","signature": "b std::string::(std::nullptr_t) const"}]},{"method": "string::string()","namespace": "std","record": "string","functorId": [{"containerId": "18","index": "11","recordId": "3","returnId": "3","hash_code": "181133","signature": "std::string::(N3rtl5allocE)"}]},{"method": "empty","namespace": "std","record": "string_view","functorId": [{"containerId": "28","index": "6","recordId": "2","returnId": "9","hash_code": "28629","signature": "b St17basic_string_viewIcSt11char_traitsIcEE::(std::nullptr_t) const"}]},{"method": "string_view::string_view()","namespace": "std","record": "string_view","functorId": [{"containerId": "18","index": "12","recordId": "2","returnId": "2","hash_code": "181222","signature": "St17basic_string_viewIcSt11char_traitsIcEE::(N3rtl5allocE)"}]},{"method": "getProfile","record": "Person","functorId": [{"containerId": "35","index": "3","recordId": "11","returnId": "3","hash_code": "353113","signature": "std::string (std::nullptr_t)"}, {"containerId": "39","index": "0","recordId": "11","returnId": "3","hash_code": "390113","signature": "std::string (b)"}, {"containerId": "41","index": "0","recordId": "11","returnId": "3","hash_code": "410113","signature": "std::string (std::string, m)"}]},{"method": "createConst","record": "Person","functorId": [{"containerId": "35","index": "2","recordId": "11","returnId": "11","hash_code": "3521111","signature": "6Person (std::nullptr_t)"}]},{"method": "getDefaults","record": "Person","functorId": [{"containerId": "35","index": "1","recordId": "11","returnId": "3","hash_code": "351113","signature": "std::string (std::nullptr_t)"}]},{"method": "updateLastName","record": "Person","functorId": [{"containerId": "37","index": "0","recordId": "11","returnId": "17","hash_code": "3701117","signature": "void 6Person::(std::string) const"}]},{"method": "getFirstName","record": "Person","functorId": [{"containerId": "22","index": "4","recordId": "11","returnId": "3","hash_code": "224113","signature": "std::string 6Person::(std::nullptr_t)"}]},{"method": "updateAddress","record": "Person","functorId": [{"containerId": "22","index": "3","recordId": "11","returnId": "17","hash_code": "2231117","signature": "void 6Person::(std::nullptr_t)"}, {"containerId": "20","index": "5","recordId": "11","returnId": "17","hash_code": "2051117","signature": "void 6Person::(std::string)"}, {"containerId": "28","index": "2","recordId": "11","returnId": "17","hash_code": "2821117","signature": "void 6Person::(std::nullptr_t) const"}, {"containerId": "37","index": "1","recordId": "11","returnId": "17","hash_code": "3711117","signature": "void 6Person::(std::string) const"}]},{"method": "createPtr","record": "Person","functorId": [{"containerId": "35","index": "0","recordId": "11","returnId": "11","hash_code": "3501111","signature": "PK6Person (std::nullptr_t)"}]},{"method": "Person::Person()","record": "Person","functorId": [{"containerId": "18","index": "4","recordId": "11","returnId": "11","hash_code": "1841111","signature": "6Person::(N3rtl5allocE)"}, {"containerId": "25","index": "2","recordId": "11","returnId": "11","hash_code": "2521111","signature": "6Person::(N3rtl5allocE, std::string)"}]},{"method": "updateBookInfo","record": "Book","functorId": [{"containerId": "22","index": "1","recordId": "10","returnId": "17","hash_code": "2211017","signature": "void 4Book::(std::nullptr_t)"}, {"containerId": "23","index": "0","recordId": "10","returnId": "17","hash_code": "2301017","signature": "void 4Book::(PKc, d, std::string)"}, {"containerId": "24","index": "0","recordId": "10","returnId": "17","hash_code": "2401017","signature": "void 4Book::(std::string, d, PKc)"}]},{"method": "addCopyrightTag","record": "Book","functorId": [{"containerId": "20","index": "2","recordId": "10","returnId": "17","hash_code": "2021017","signature": "void 4Book::(std::string)"}]},{"method": "getPublishedOn","record": "Book","functorId": [{"containerId": "22","index": "0","recordId": "10","returnId": "3","hash_code": "220103","signature": "std::string 4Book::(std::nullptr_t)"}]},{"method": "setAuthor","record": "Book","functorId": [{"containerId": "20","index": "0","recordId": "10","returnId": "17","hash_code": "2001017","signature": "void 4Book::(std::string)"}]},{"method": "setDescription","record": "Book","functorId": [{"containerId": "20","index": "1","recordId": "10","returnId": "17","hash_code": "2011017","signature": "void 4Book::(std::string)"}]},{"method": "addPreface","record": "Book","functorId": [{"containerId": "21","index": "0","recordId": "10","returnId": "17","hash_code": "2101017","signature": "void 4Book::(std::string, const std::string&)"}]},{"method": "Book::Book()","record": "Book","functorId": [{"containerId": "18","index": "0","recordId": "10","returnId": "10","hash_code": "1801010","signature": "4Book::(N3rtl5allocE)"}, {"containerId": "19","index": "0","recordId": "10","returnId": "10","hash_code": "1901010","signature": "4Book::(N3rtl5allocE, d, std::string)"}]},{"method": "getBookByTitle","record": "Library","functorId": [{"containerId": "30","index": "1","recordId": "13","returnId": "10","hash_code": "3011310","signature": "4Book (const std::string&)"}]},{"method": "addBook","record": "Library","functorId": [{"containerId": "40","index": "0","recordId": "13","returnId": "17","hash_code": "4001317","signature": "void (4Book)"}]},{"method": "Library::Library()","record": "Library","functorId": [{"containerId": "18","index": "7","recordId": "13","returnId": "13","hash_code": "1871313","signature": "7Library::(N3rtl5allocE)"}]},{"method": "setAnimalName","record": "Animal","functorId": [{"containerId": "29","index": "0","recordId": "12","returnId": "17","hash_code": "2901217","signature": "void 6Animal::(const std::string&)"}, {"containerId": "31","index": "0","recordId": "12","returnId": "17","hash_code": "3101217","signature": "void 6Animal::(std::string&)"}, {"containerId": "32","index": "0","recordId": "12","returnId": "17","hash_code": "3201217","signature": "void 6Animal::(const std::string&&)"}]},{"method": "getFamilyName","record": "Animal","functorId": [{"containerId": "28","index": "1","recordId": "12","returnId": "3","hash_code": "281123","signature": "std::string 6Animal::(std::nullptr_t) const"}]},{"method": "updateZooKeeper","record": "Animal","functorId": [{"containerId": "30","index": "0","recordId": "12","returnId": "3","hash_code": "300123","signature": "std::string (const std::string&)"}, {"containerId": "33","index": "0","recordId": "12","returnId": "3","hash_code": "330123","signature": "std::string (std::string&)"}, {"containerId": "34","index": "0","recordId": "12","returnId": "3","hash_code": "340123","signature": "std::string (const std::string&&)"}]},{"method": "setFamilyName","record": "Animal","functorId": [{"containerId": "20","index": "4","recordId": "12","returnId": "17","hash_code": "2041217","signature": "void 6Animal::(std::string)"}]},{"method": "Animal::Animal()","record": "Animal","functorId": [{"containerId": "18","index": "3","recordId": "12","returnId": "12","hash_code": "1831212","signature": "6Animal::(N3rtl5allocE)"}, {"containerId": "25","index": "1","recordId": "12","returnId": "12","hash_code": "2511212","signature": "6Animal::(N3rtl5allocE, std::string)"}]},{"method": "char::char()","record": "char","functorId": [{"containerId": "18","index": "6","recordId": "1","returnId": "1","hash_code": "18611","signature": "c::(N3rtl5allocE)"}]},{"method": "void::void()","record": "void","functorId": [{"containerId": "18","index": "5","recordId": "17","returnId": "17","hash_code": "1851717","signature": "void::(N3rtl5allocE)"}]}]
60 changes: 60 additions & 0 deletions RTLBenchmarkApp/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
cmake_minimum_required(VERSION 3.20)
project(RTLBenchmarkApp LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# ===============================
# Dependencies (Google Benchmark)
# ===============================
include(FetchContent)

FetchContent_Declare(
benchmark
GIT_REPOSITORY https://github.com/google/benchmark.git
GIT_TAG v1.8.3
)

# Prevent benchmark from adding extra projects
set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "" FORCE)
set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "" FORCE)

FetchContent_GetProperties(benchmark)
if(NOT benchmark_POPULATED)
FetchContent_Populate(benchmark)
add_subdirectory(${benchmark_SOURCE_DIR} ${benchmark_BINARY_DIR} EXCLUDE_FROM_ALL)
endif()

# ===============================
# Common Include Paths
# ===============================
set(RTL_INCLUDE_DIRS
inc
"${CMAKE_SOURCE_DIR}/ReflectionTemplateLib/common"
"${CMAKE_SOURCE_DIR}/ReflectionTemplateLib/detail/inc"
"${CMAKE_SOURCE_DIR}/ReflectionTemplateLib/access/inc"
"${CMAKE_SOURCE_DIR}/ReflectionTemplateLib/builder/inc"
)

# ===============================
# Test Executable
# ===============================
set(CXX_EXE_NAME RTLBenchmarkApp)

# ===============================
# Benchmarks (only target)
# ===============================
add_executable(${CXX_EXE_NAME}
src/main.cpp
src/BenchMark.cpp # <-- added
src/BenchMark.h # <-- optional (for IDE visibility)
)


target_include_directories(${CXX_EXE_NAME} PRIVATE ${RTL_INCLUDE_DIRS})

target_link_libraries(${CXX_EXE_NAME}
PRIVATE
benchmark
ReflectionTemplateLib
)
157 changes: 157 additions & 0 deletions RTLBenchmarkApp/src/BenchMark.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@

#include <string>
#include <optional>

#include "BenchMark.h"
#include "RTLibInterface.h"

#if defined(_MSC_VER)
# define NOINLINE __declspec(noinline)
#elif defined(__GNUC__)
# define NOINLINE __attribute__((noinline))
#else
# define NOINLINE
#endif


namespace {

static std::optional<std::string> g_msg;

NOINLINE static void sendMessage(const char* pMsg)
{
g_msg = pMsg;
}

NOINLINE static std::string getMessage(const char* pMsg)
{
g_msg = pMsg;
return std::string(pMsg);
}

struct Node
{
NOINLINE void sendMessage(const char* pMsg)
{
g_msg = pMsg;
}

NOINLINE std::string getMessage(const char* pMsg)
{
g_msg = pMsg;
return std::string(pMsg);
}
};

const rtl::CxxMirror& cxx_mirror()
{
static auto m = rtl::CxxMirror({

rtl::type().record<Node>("node").build(),

rtl::type().function("sendMessage").build(sendMessage),

rtl::type().member<Node>().method("sendMessage").build(&Node::sendMessage),

rtl::type().function("getMessage").build(getMessage),

rtl::type().member<Node>().method("getMessage").build(&Node::getMessage)
});
return m;
}
}


namespace rtl_bench
{
void BenchMark::directCall_noReturn(benchmark::State& state)
{
for (auto _ : state)
{
sendMessage("direct");
benchmark::DoNotOptimize(g_msg);
}
}


void BenchMark::lambdaCall_noReturn(benchmark::State& state)
{
std::function sendMsg = [](const char* pMsg) {
sendMessage(pMsg);
};

for (auto _ : state)
{
sendMsg("lambda");
benchmark::DoNotOptimize(g_msg);
}
}


void BenchMark::reflectedCall_noReturn(benchmark::State& state)
{
rtl::Function sendMsg = cxx_mirror().getFunction("sendMessage").value();
for (auto _ : state)
{
benchmark::DoNotOptimize(sendMsg.bind<const char*>().call("reflected"));
}
}


void BenchMark::reflectedMethodCall_noReturn(benchmark::State& state)
{
rtl::Record rNode = cxx_mirror().getRecord("node").value();
rtl::Method sendMsg = rNode.getMethod("sendMessage").value();
rtl::RObject robj = rNode.create<rtl::alloc::Stack>().second;

for (auto _ : state)
{
benchmark::DoNotOptimize(sendMsg.bind<const char*>(robj).call("reflected"));
}
}


void BenchMark::directCall_withReturn(benchmark::State& state)
{
for (auto _ : state)
{
benchmark::DoNotOptimize(getMessage("direct"));
}
}


void BenchMark::lambdaCall_withReturn(benchmark::State& state)
{
std::function getMsg = [](const char* pMsg) {
return getMessage(pMsg);
};

for (auto _ : state)
{
benchmark::DoNotOptimize(getMsg("lambda"));
}
}


void BenchMark::reflectedCall_withReturn(benchmark::State& state)
{
rtl::Function getMsg = cxx_mirror().getFunction("getMessage").value();
for (auto _ : state)
{
benchmark::DoNotOptimize(getMsg.bind<const char*>().call("reflected"));
}
}


void BenchMark::reflectedMethodCall_withReturn(benchmark::State& state)
{
rtl::Record rNode = cxx_mirror().getRecord("node").value();
rtl::Method getMsg = rNode.getMethod("getMessage").value();
rtl::RObject robj = rNode.create<rtl::alloc::Stack>().second;

for (auto _ : state)
{
benchmark::DoNotOptimize(getMsg.bind<const char*>(robj).call("reflected"));
}
}
}
25 changes: 25 additions & 0 deletions RTLBenchmarkApp/src/BenchMark.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#pragma once

#include <benchmark/benchmark.h>

namespace rtl_bench
{
struct BenchMark
{
static void directCall_noReturn(benchmark::State& state);

static void lambdaCall_noReturn(benchmark::State& state);

static void reflectedCall_noReturn(benchmark::State& state);

static void reflectedMethodCall_noReturn(benchmark::State& state);

static void directCall_withReturn(benchmark::State& state);

static void lambdaCall_withReturn(benchmark::State& state);

static void reflectedCall_withReturn(benchmark::State& state);

static void reflectedMethodCall_withReturn(benchmark::State& state);
};
}
19 changes: 19 additions & 0 deletions RTLBenchmarkApp/src/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@

#include <string>
#include <benchmark/benchmark.h>

#include "BenchMark.h"

// ------------------------------------------------------------
// Register benchmarks
// ------------------------------------------------------------

BENCHMARK(rtl_bench::BenchMark::directCall_noReturn);
BENCHMARK(rtl_bench::BenchMark::lambdaCall_noReturn);
BENCHMARK(rtl_bench::BenchMark::reflectedCall_noReturn);
BENCHMARK(rtl_bench::BenchMark::reflectedMethodCall_noReturn);
BENCHMARK(rtl_bench::BenchMark::directCall_withReturn);
BENCHMARK(rtl_bench::BenchMark::lambdaCall_withReturn);
BENCHMARK(rtl_bench::BenchMark::reflectedCall_withReturn);
BENCHMARK(rtl_bench::BenchMark::reflectedMethodCall_withReturn);
BENCHMARK_MAIN();
Loading
Loading