diff --git a/python/dune/xt/CMakeLists.txt b/python/dune/xt/CMakeLists.txt index dcc64f38b30c7b68213c1fbe7d0ac9c8bb5cd476..be4f8a0b3529ea301368672023e375b5a43b966f 100644 --- a/python/dune/xt/CMakeLists.txt +++ b/python/dune/xt/CMakeLists.txt @@ -12,4 +12,5 @@ add_subdirectory(common) dune_pybindxi_add_module(_common EXCLUDE_FROM_ALL bindings.cc) dune_pybindxi_add_module(_empty EXCLUDE_FROM_ALL empty.cc) dune_pybindxi_add_module(_logging EXCLUDE_FROM_ALL logging.cc) +dune_pybindxi_add_module(_timings EXCLUDE_FROM_ALL timings.cc) diff --git a/python/dune/xt/common/timings.py b/python/dune/xt/common/timings.py new file mode 100644 index 0000000000000000000000000000000000000000..7a6066dcc2281555351a71fe81b9521edd66b9df --- /dev/null +++ b/python/dune/xt/common/timings.py @@ -0,0 +1,4 @@ + +from dune.xt._timings import * + +timings = instance() \ No newline at end of file diff --git a/python/dune/xt/timings.cc b/python/dune/xt/timings.cc new file mode 100644 index 0000000000000000000000000000000000000000..f1bc27a48e3f41644c6594956f56768987535859 --- /dev/null +++ b/python/dune/xt/timings.cc @@ -0,0 +1,52 @@ +// This file is part of the dune-xt-common project: +// https://github.com/dune-community/dune-xt-common +// Copyright 2009-2018 dune-xt-common developers and contributors. All rights reserved. +// License: Dual licensed as BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause) +// or GPL-2.0+ (http://opensource.org/licenses/gpl-license) +// with "runtime exception" (http://www.dune-project.org/license.html) +// Authors: +// Rene Milk (2018) + +#include "config.h" + +#include <string> +#include <vector> + +#include <dune/pybindxi/pybind11.h> +#include <dune/pybindxi/stl.h> +#include <dune/pybindxi/iostream.h> + +#include <python/dune/xt/common/bindings.hh> +#include <dune/xt/common/python.hh> +#include <dune/xt/common/timings.hh> +#include <python/dune/xt/common/exceptions.bindings.hh> +#include <dune/common/parallel/mpihelper.hh> + + +PYBIND11_MODULE(_timings, m) +{ + namespace py = pybind11; + using namespace pybind11::literals; + using namespace Dune::XT::Common; + + Dune::XT::Common::bindings::addbind_exceptions(m); + + Dune::XT::Common::bindings::add_initialization(m, "dune.xt.common.timings"); + + + py::class_<Timings>(m, "Timings") + .def("start", &Timings::start, "set this to begin a named section") + .def("reset", py::overload_cast<std::string>(&Timings::reset), "set elapsed time back to 0 for section_name") + .def("reset", py::overload_cast<>(&Timings::reset), "set elapsed time back to 0 for section_name") + .def("stop", py::overload_cast<std::string>(&Timings::stop), "stop all timer for given section only") + .def("stop", py::overload_cast<>(&Timings::stop), "stop all running timers") + .def("walltime", &Timings::walltime, "get runtime of section in milliseconds") + //! TODO this actually accepts an ostream + .def("output_simple", [](Timings& self) { self.output_simple(); }, "outputs per-rank csv-file") + .def("output_per_rank", &Timings::output_per_rank, "outputs walltime only") + //! TODO this actually accepts an MPICOMM and an ostream too + .def("output_all_measures", + [](Timings& self) { self.output_all_measures(); }, + "outputs per rank and global averages of all measures"); + m.def("instance", &timings, py::return_value_policy::reference); +} diff --git a/python/test/base.py b/python/test/base.py index 0555f790a3f13dc8a440d2b7edbdb240d0f975bb..4aeb333a94eb876a083e72257837e68dc2007352 100644 --- a/python/test/base.py +++ b/python/test/base.py @@ -33,4 +33,12 @@ def test_logging(): lg.create(lg.log_max); lg.info('log info test') lg.error('log error test') - lg.debug('log debug test') \ No newline at end of file + lg.debug('log debug test') + + +def test_timings(): + from dune.xt.common.timings import timings + timings.reset() + timings.start("foo.bar") + timings.stop() + timings.output_simple()