Skip to content

Commit

Permalink
Add some benchmarks
Browse files Browse the repository at this point in the history
  • Loading branch information
dacap committed Aug 16, 2018
1 parent 7934371 commit 9158cfd
Show file tree
Hide file tree
Showing 4 changed files with 168 additions and 6 deletions.
43 changes: 38 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,30 @@ matrix:
osx_image: xcode8
env:
- SANITIZER=
- BUILD_TYPE=Debug
- BENCHMARKS=OFF
- os: osx
osx_image: xcode8
env:
- SANITIZER=-fsanitize=thread
- BUILD_TYPE=Debug
- BENCHMARKS=OFF
- os: osx
osx_image: xcode9
env:
- SANITIZER=
- BUILD_TYPE=Debug
- BENCHMARKS=OFF
- os: osx
osx_image: xcode9
env:
- SANITIZER=-fsanitize=thread
- BUILD_TYPE=Debug
- BENCHMARKS=OFF
- os: linux
env:
- BUILD_TYPE=Debug
- BENCHMARKS=OFF
- os: linux
addons:
apt:
Expand All @@ -27,8 +38,10 @@ matrix:
packages:
- g++-4.9
env:
- MATRIX_EVAL="CC=gcc-4.9 && CXX=g++-4.9"
- SANITIZER=
- MATRIX_EVAL="CC=gcc-4.9 && CXX=g++-4.9"
- SANITIZER=
- BUILD_TYPE=Debug
- BENCHMARKS=OFF
- os: linux
addons:
apt:
Expand All @@ -37,8 +50,10 @@ matrix:
packages:
- g++-5
env:
- MATRIX_EVAL="CC=gcc-5 && CXX=g++-5"
- SANITIZER=
- MATRIX_EVAL="CC=gcc-5 && CXX=g++-5"
- SANITIZER=
- BUILD_TYPE=Debug
- BENCHMARKS=OFF
- os: linux
addons:
apt:
Expand All @@ -49,6 +64,20 @@ matrix:
env:
- MATRIX_EVAL="CC=gcc-6 && CXX=g++-6"
- SANITIZER=
- BUILD_TYPE=Debug
- BENCHMARKS=OFF
- os: linux
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-7
env:
- MATRIX_EVAL="CC=gcc-7 && CXX=g++-7"
- SANITIZER=
- BUILD_TYPE=Debug
- BENCHMARKS=OFF
- os: linux
addons:
apt:
Expand All @@ -59,17 +88,21 @@ matrix:
env:
- MATRIX_EVAL="CC=gcc-7 && CXX=g++-7"
- SANITIZER=
- BUILD_TYPE=Release
- BENCHMARKS=ON

before_install:
- eval "${MATRIX_EVAL}"

before_script:
- mkdir build
- cd build
- cmake .. -DCMAKE_BUILD_TYPE=Debug
- cmake .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE
-DCMAKE_CXX_FLAGS=$SANITIZER
-DCMAKE_EXE_LINKER_FLAGS=$SANITIZER
-DOBSERVABLE_BENCHMARKS=$BENCHMARKS

script:
- make
- ctest --output-on-failure
- if [[ "$BENCHMARKS" == "ON" ]] ; then ./benchmarks/obs_benchmarks ; fi
7 changes: 6 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
cmake_minimum_required(VERSION 3.2)

project(observable CXX)
option(OBSERVABLE_TESTS "Compile observable tests" on)
option(OBSERVABLE_TESTS "Compile observable tests" ON)
option(OBSERVABLE_BENCHMARKS "Compile observable benchmarks" OFF)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
Expand All @@ -21,3 +22,7 @@ if(OBSERVABLE_TESTS)
enable_testing()
add_subdirectory(tests)
endif()

if(OBSERVABLE_BENCHMARKS)
add_subdirectory(benchmarks)
endif()
30 changes: 30 additions & 0 deletions benchmarks/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Observable Library
# Copyright (C) 2018 David Capello

include(ExternalProject)
ExternalProject_Add(googlebenchmark-project
URL https://github.com/google/benchmark/archive/master.zip
PREFIX "${CMAKE_BINARY_DIR}/googlebenchmark"
INSTALL_DIR "${CMAKE_BINARY_DIR}/googlebenchmark"
BUILD_BYPRODUCTS "${CMAKE_BINARY_DIR}/googlebenchmark/lib/${CMAKE_STATIC_LIBRARY_PREFIX}benchmark${CMAKE_STATIC_LIBRARY_SUFFIX}"
CMAKE_CACHE_ARGS
-DBENCHMARK_ENABLE_GTEST_TESTS:BOOL=OFF
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
-DCMAKE_INSTALL_LIBDIR:PATH=<INSTALL_DIR>/lib)

ExternalProject_Get_Property(googlebenchmark-project install_dir)
set(GOOGLEBENCHMARK_INCLUDE_DIRS ${install_dir}/include)
set(GOOGLEBENCHMARK_LIBRARY ${install_dir}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}benchmark${CMAKE_STATIC_LIBRARY_SUFFIX})

# Create the directory so changing INTERFACE_INCLUDE_DIRECTORIES doesn't fail
file(MAKE_DIRECTORY ${GOOGLEBENCHMARK_INCLUDE_DIRS})

add_library(googlebenchmark STATIC IMPORTED)
set_target_properties(googlebenchmark PROPERTIES
IMPORTED_LOCATION ${GOOGLEBENCHMARK_LIBRARY}
INTERFACE_INCLUDE_DIRECTORIES ${GOOGLEBENCHMARK_INCLUDE_DIRS})
add_dependencies(googlebenchmark googlebenchmark-project)

add_executable(obs_benchmarks obs_benchmarks.cpp)
target_link_libraries(obs_benchmarks obs googlebenchmark)
94 changes: 94 additions & 0 deletions benchmarks/obs_benchmarks.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
// Observable Library
// Copyright (c) 2018 David Capello
//
// This file is released under the terms of the MIT license.
// Read LICENSE.txt for more information.

#include "obs.h"
#include <benchmark/benchmark.h>

#include <atomic>
#include <condition_variable>
#include <future>
#include <thread>
#include <vector>

static void BM_ObsCreation(benchmark::State& state) {
for (auto _ : state) {
state.PauseTiming();
{
obs::signal<void()> sig;
state.ResumeTiming();
}
}
}
BENCHMARK(BM_ObsCreation);

static void BM_ObsConnect(benchmark::State& state) {
obs::signal<void()> sig;
for (auto _ : state)
sig.connect([]{ });
}
BENCHMARK(BM_ObsConnect);

static void BM_ObsDisconnect(benchmark::State& state) {
obs::signal<void()> sig;
for (auto _ : state) {
state.PauseTiming();
obs::connection c = sig.connect([]{ });
state.ResumeTiming();
c.disconnect();
}
}
BENCHMARK(BM_ObsDisconnect);

static void BM_ObsSignal(benchmark::State& state) {
obs::signal<void()> sig;
std::vector<obs::scoped_connection> conns(state.range(0));
for (auto& c : conns)
c = sig.connect([]{ });
for (auto _ : state) {
sig();
}
}
BENCHMARK(BM_ObsSignal)->Range(1, 1024);

static void BM_ObsThreads(benchmark::State& state) {
obs::signal<void()> sig;
for (auto _ : state) {
state.PauseTiming();
std::vector<std::thread> threads;
std::atomic<int> count = { 0 };
for (int i=0; i<state.range(0); ++i) {
threads.emplace_back(
[&sig, &count]{
std::mutex m;
std::unique_lock<std::mutex> l(m);
std::condition_variable cv;
obs::scoped_connection c =
sig.connect(
[&m, &cv]{
std::unique_lock<std::mutex> l(m);
cv.notify_one();
});
++count;
cv.wait(l);
});
}

// Wait that all threads are created and waiting for the signal.
while (count < state.range(0))
std::this_thread::yield();
state.ResumeTiming();

sig();

state.PauseTiming();
for (auto& t : threads)
t.join();
state.ResumeTiming();
}
}
BENCHMARK(BM_ObsThreads)->Range(1, 1024);

BENCHMARK_MAIN();

0 comments on commit 9158cfd

Please sign in to comment.