From c282406add633b1f32a97cdbb49d446d7b0e3b9d Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Sat, 6 May 2017 15:06:24 +0200 Subject: [PATCH] Add profiling of CPU and memory usage (#912) --- .travis.yml | 2 +- tests/profiling/filter_massif_output.py | 41 +++++++++++++++++++++++++ tools/travis-ci/run.sh | 23 +++++++++++++- 3 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 tests/profiling/filter_massif_output.py diff --git a/.travis.yml b/.travis.yml index f0ac2d7cd..8d5883507 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ matrix: - gcc-multilib - os: linux compiler: gcc - env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Debug + env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Debug OPJ_CI_PROFILE=1 - os: linux compiler: clang env: OPJ_CI_ARCH=x86_64 OPJ_CI_BUILD_CONFIGURATION=Debug OPJ_CI_ASAN=1 diff --git a/tests/profiling/filter_massif_output.py b/tests/profiling/filter_massif_output.py new file mode 100644 index 000000000..173f68929 --- /dev/null +++ b/tests/profiling/filter_massif_output.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2017, IntoPIX SA +# Contact: support@intopix.com +# Author: Even Rouault +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +import sys + +lines = open(sys.argv[1], 'rt').readlines() +display_next_lines = False +for line in lines: + line = line.replace('\n', '') + if line == 'heap_tree=peak': + display_next_lines = True + elif display_next_lines: + if line == '#-----------': + break + print(line) diff --git a/tools/travis-ci/run.sh b/tools/travis-ci/run.sh index 782622b50..d4b61ac66 100755 --- a/tools/travis-ci/run.sh +++ b/tools/travis-ci/run.sh @@ -184,7 +184,9 @@ export OPJ_BINARY_DIR=$(opjpath -m ${PWD}/build) export OPJ_BUILD_CONFIGURATION=${OPJ_CI_BUILD_CONFIGURATION} export OPJ_DO_SUBMIT=${OPJ_DO_SUBMIT} -ctest -S ${OPJ_SOURCE_DIR}/tools/ctest_scripts/travis-ci.cmake -V || true +if [ "${OPJ_SKIP_REBUILD:-}" != "1" ]; then + ctest -S ${OPJ_SOURCE_DIR}/tools/ctest_scripts/travis-ci.cmake -V || true +fi # ctest will exit with various error codes depending on version. # ignore ctest exit code & parse this ourselves set +x @@ -303,4 +305,23 @@ New/unknown test failure found!!! fi fi +if [ "${OPJ_CI_PROFILE:-}" == "1" ]; then + rm -rf build_gprof + mkdir build_gprof + cd build_gprof + # We need static linking for gprof + cmake "-DCMAKE_C_FLAGS=-pg -O3" -DCMAKE_EXE_LINKER_FLAGS=-pg -DCMAKE_SHARED_LINKER_FLAGS=-pg -DBUILD_SHARED_LIBS=OFF .. + make -j3 + cd .. + build_gprof/bin/opj_decompress -i data/input/nonregression/kodak_2layers_lrcp.j2c -o out.tif > /dev/null + echo "Most CPU consuming functions:" + gprof build_gprof/bin/opj_decompress gmon.out | head || true + + rm -rf massif.out.* + valgrind --tool=massif build/bin/opj_decompress -i data/input/nonregression/kodak_2layers_lrcp.j2c -o out.tif >/dev/null 2>/dev/null + echo "" + echo "Memory consumption profile:" + python tests/profiling/filter_massif_output.py massif.out.* +fi + exit ${OPJ_CI_RESULT}