diff --git a/CMakeLists.txt b/CMakeLists.txt
index fb348bb0775464d65a0c1da1146551c402f0cec7..58f1d75c29bd186c1746c17f2a69cba03f8a7fd4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -159,6 +159,14 @@ target_include_directories(${PROJECT_NAME}_export PUBLIC eisgenerator)
 set_target_properties(${PROJECT_NAME}_export PROPERTIES COMPILE_FLAGS ${COMMON_COMPILE_FLAGS} LINK_FLAGS ${COMMON_LINK_FLAGS})
 install(TARGETS ${PROJECT_NAME}_export DESTINATION bin)
 
+link_directories(${CMAKE_CURRENT_BINARY_DIR})
+set(SRC_FILES_TEST_APP bench.cpp)
+add_executable(${PROJECT_NAME}_bench ${SRC_FILES_TEST_APP})
+add_dependencies(${PROJECT_NAME}_bench ${PROJECT_NAME})
+target_link_libraries(${PROJECT_NAME}_bench ${LIBS_TEST})
+target_include_directories(${PROJECT_NAME}_bench PUBLIC eisgenerator)
+set_target_properties(${PROJECT_NAME}_bench PROPERTIES COMPILE_FLAGS ${COMMON_COMPILE_FLAGS} LINK_FLAGS ${COMMON_LINK_FLAGS})
+
 if (DOXYGEN_FOUND)
 	set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/doc/libeisgenerator.doxygen.in)
 	set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/doc/libeisgenerator.doxygen)
diff --git a/bench.cpp b/bench.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..714cfbe20104047916ae73c6b6eba9622509e1b0
--- /dev/null
+++ b/bench.cpp
@@ -0,0 +1,69 @@
+#include <chrono>
+#include <cassert>
+#include <thread>
+
+#include "model.h"
+#include "log.h"
+#include "compcache.h"
+
+
+int main()
+{
+	eis::Log::level = eis::Log::INFO;
+	eis::Log(eis::Log::INFO)<<"Eisgenerator Benchmark";
+
+	std::string modelStr = "rp-rp-rp-rl";
+	eis::Log::level = eis::Log::ERROR;
+	static constexpr long repetitions = 50000;
+	eis::Model model(modelStr, 100, true);
+	eis::Range omega(0.1, 1e6, 50, true);
+	const long datapoints = repetitions*50;
+	eis::Log::level = eis::Log::INFO;
+	eis::CompCache* cache = eis::CompCache::getInstance();
+	std::chrono::high_resolution_clock clock;
+	std::vector<size_t> indecies(repetitions);
+
+	eis::Log(eis::Log::INFO)<<"model: "<<modelStr<<" with "<<model.getRequiredStepsForSweeps()<<" steps for sweeps";
+
+	for(size_t i = 0; i < repetitions; ++i)
+		indecies[i] = i % model.getRequiredStepsForSweeps();
+
+	cache->dropAllObjects();
+
+	eis::Log(eis::Log::INFO)<<"\nSingle Core:";
+
+	auto start = clock.now();
+	for(size_t i = 0; i < repetitions; ++i)
+		model.executeSweep(omega, i % model.getRequiredStepsForSweeps());
+	auto end = clock.now();
+	std::chrono::duration<double> diff = end - start;
+	eis::Log(eis::Log::INFO)<<"Graph execution:\t"<<(datapoints*1000000)/std::chrono::duration_cast<std::chrono::nanoseconds>(diff).count()<<" kdp/s";
+
+	model.compile();
+	start = clock.now();
+	for(size_t i = 0; i < repetitions; ++i)
+		model.executeSweep(omega, i % model.getRequiredStepsForSweeps());
+	end = clock.now();
+	diff = end - start;
+	eis::Log(eis::Log::INFO)<<"Compiled execution:\t"<<(datapoints*1000000)/std::chrono::duration_cast<std::chrono::nanoseconds>(diff).count()<<" kdp/s";
+
+	cache->dropAllObjects();
+	model.dropCompiled();
+
+	eis::Log(eis::Log::INFO)<<"\nMulti Core with "<<std::thread::hardware_concurrency()<<" threads:";
+
+	start = clock.now();
+	model.executeSweeps(omega, indecies, true);
+	end = clock.now();
+	diff = end - start;
+	eis::Log(eis::Log::INFO)<<"Graph execution:\t"<<(datapoints*1000000)/std::chrono::duration_cast<std::chrono::nanoseconds>(diff).count()<<" kdp/s";
+
+	model.compile();
+	start = clock.now();
+	model.executeSweeps(omega, indecies, true);
+	end = clock.now();
+	diff = end - start;
+	eis::Log(eis::Log::INFO)<<"Compiled execution:\t"<<(datapoints*1000000)/std::chrono::duration_cast<std::chrono::nanoseconds>(diff).count()<<" kdp/s";
+
+
+}
diff --git a/eisgenerator/model.h b/eisgenerator/model.h
index 0c5d1c4501077442aa9f197e7c1d69b028cbf4ef..7d8473fc2aafbe6923d6158e3092128caca918fa 100644
--- a/eisgenerator/model.h
+++ b/eisgenerator/model.h
@@ -245,6 +245,12 @@ public:
 	*/
 	bool compile();
 
+	/**
+	* @brief This function drops the compiled object code, reverting to graph execution
+	*
+	*/
+	void dropCompiled();
+
 	/**
 	* @brief This member determines if the model is in a state ready to execute.
 	*
diff --git a/model.cpp b/model.cpp
index 27593f9d2390e7f255582596331e23bf51ba48f3..a68cecd79679cbe489f5843127c97e23b5c87461 100644
--- a/model.cpp
+++ b/model.cpp
@@ -683,6 +683,11 @@ bool Model::compile()
 	return true;
 }
 
+void Model::dropCompiled()
+{
+	_compiledModel = nullptr;
+}
+
 std::string Model::getCode()
 {
 	if(!_model || !_model->compileable())