diff options
-rw-r--r-- | mwe/profiling/.gitignore | 1 | ||||
-rw-r--r-- | mwe/profiling/CMakeLists.txt | 14 | ||||
-rw-r--r-- | mwe/profiling/lib/CMakeLists.txt | 11 | ||||
-rw-r--r-- | mwe/profiling/lib/lib.cpp | 26 | ||||
-rw-r--r-- | mwe/profiling/lib/lib.h | 12 | ||||
-rw-r--r-- | mwe/profiling/main.c | 7 | ||||
-rw-r--r-- | mwe/profiling/makefile | 1 | ||||
-rw-r--r-- | mwe/profiling/readme.md | 11 |
8 files changed, 83 insertions, 0 deletions
diff --git a/mwe/profiling/.gitignore b/mwe/profiling/.gitignore new file mode 100644 index 0000000..6a28331 --- /dev/null +++ b/mwe/profiling/.gitignore @@ -0,0 +1 @@ +callgrind.out.* diff --git a/mwe/profiling/CMakeLists.txt b/mwe/profiling/CMakeLists.txt new file mode 100644 index 0000000..a76aeb5 --- /dev/null +++ b/mwe/profiling/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.28) + +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_BUILD_TYPE Debug) + +project(main C CXX) + +add_subdirectory(lib) + +add_executable(main main.c) + +target_link_libraries(main PRIVATE test) + diff --git a/mwe/profiling/lib/CMakeLists.txt b/mwe/profiling/lib/CMakeLists.txt new file mode 100644 index 0000000..bd78d59 --- /dev/null +++ b/mwe/profiling/lib/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.28) + +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_BUILD_TYPE Release) + +project(lib C CXX) + +add_library(test SHARED lib.cpp) +target_include_directories(test SYSTEM INTERFACE .) + diff --git a/mwe/profiling/lib/lib.cpp b/mwe/profiling/lib/lib.cpp new file mode 100644 index 0000000..9ea8f26 --- /dev/null +++ b/mwe/profiling/lib/lib.cpp @@ -0,0 +1,26 @@ +#include <chrono> +#include <thread> +#include <random> + +#include "lib.h" + +// yeah this is bad, boo hoo +using namespace std; +using std::this_thread::sleep_for; +using std::chrono::milliseconds; + +random_device dev; +mt19937 rng(dev()); +uniform_int_distribution<mt19937::result_type> random_dist(1, 50); + +static void random_slow() { + int delay = random_dist(rng); + sleep_for(milliseconds(delay)); +} + +int recursive(int rem) { + if (rem <= 0) return 0; + random_slow(); + return recursive(rem - 1) + recursive(rem - 2); +} + diff --git a/mwe/profiling/lib/lib.h b/mwe/profiling/lib/lib.h new file mode 100644 index 0000000..fc413ff --- /dev/null +++ b/mwe/profiling/lib/lib.h @@ -0,0 +1,12 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +int recursive(int rem); + +#ifdef __cplusplus +} +#endif + diff --git a/mwe/profiling/main.c b/mwe/profiling/main.c new file mode 100644 index 0000000..689da52 --- /dev/null +++ b/mwe/profiling/main.c @@ -0,0 +1,7 @@ +#include <lib.h> + +int main() { + int x = recursive(8); + return x == 0; +} + diff --git a/mwe/profiling/makefile b/mwe/profiling/makefile new file mode 100644 index 0000000..d637b57 --- /dev/null +++ b/mwe/profiling/makefile @@ -0,0 +1 @@ +include ../../lazy.mk diff --git a/mwe/profiling/readme.md b/mwe/profiling/readme.md new file mode 100644 index 0000000..99b1ee2 --- /dev/null +++ b/mwe/profiling/readme.md @@ -0,0 +1,11 @@ +# profiling test + +Test how callgrind handles executables that call library functions from +libraries w/o debug symbols. + +To collect run info, run + +``` +$ valgrind --tool=callgrind build/main +``` + |