Skip to content

Commit

Permalink
Move benchmarks into separate project and package
Browse files Browse the repository at this point in the history
This allows benchmarking without forcing e.g. aeson
to depend on local uuid-types.

Also, conveniently, we can generate own GHA workflow for
second, benchmark, project. So we can still run CI that benchmarks
are building fine.
  • Loading branch information
phadej committed Feb 16, 2021
1 parent 68e8fb4 commit 2cea75b
Show file tree
Hide file tree
Showing 18 changed files with 344 additions and 78 deletions.
2 changes: 1 addition & 1 deletion .git-blame-ignore-revs
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# Move code into subdirectories
37ae11973e287135e02cfcbde17b7830f79f5e69
bf1ac1bad848bb2c081f0cae1631bf53811ec05a
177 changes: 177 additions & 0 deletions .github/workflows/haskell-ci-bench.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
# This GitHub workflow config has been generated by a script via
#
# haskell-ci 'github' '--project' 'cabal.bench.project' '-o' '.github/workflows/haskell-ci-bench.yml' '--github-action-name' 'Benchmarks'
#
# To regenerate the script (for example after adjusting tested-with) run
#
# haskell-ci regenerate
#
# For more information, see https://github.com/haskell-CI/haskell-ci
#
# version: 0.11.20210214
#
# REGENDATA ("0.11.20210214",["github","--project","cabal.bench.project","-o",".github/workflows/haskell-ci-bench.yml","--github-action-name","Benchmarks"])
#
name: Benchmarks
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
linux:
name: Benchmarks - Linux - GHC ${{ matrix.ghc }}
runs-on: ubuntu-18.04
container:
image: buildpack-deps:bionic
continue-on-error: ${{ matrix.allow-failure }}
strategy:
matrix:
include:
- ghc: 8.10.3
allow-failure: false
- ghc: 8.8.4
allow-failure: false
- ghc: 8.6.4
allow-failure: false
- ghc: 8.4.4
allow-failure: false
- ghc: 8.2.2
allow-failure: false
- ghc: 8.0.2
allow-failure: false
fail-fast: false
steps:
- name: apt
run: |
apt-get update
apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common
apt-add-repository -y 'ppa:hvr/ghc'
apt-get update
apt-get install -y ghc-$GHC_VERSION cabal-install-3.2
env:
GHC_VERSION: ${{ matrix.ghc }}
- name: Set PATH and environment variables
run: |
echo "$HOME/.cabal/bin" >> $GITHUB_PATH
echo "LANG=C.UTF-8" >> $GITHUB_ENV
echo "CABAL_DIR=$HOME/.cabal" >> $GITHUB_ENV
echo "CABAL_CONFIG=$HOME/.cabal/config" >> $GITHUB_ENV
HC=/opt/ghc/$GHC_VERSION/bin/ghc
echo "HC=$HC" >> $GITHUB_ENV
echo "HCPKG=/opt/ghc/$GHC_VERSION/bin/ghc-pkg" >> $GITHUB_ENV
echo "HADDOCK=/opt/ghc/$GHC_VERSION/bin/haddock" >> $GITHUB_ENV
echo "CABAL=/opt/cabal/3.2/bin/cabal -vnormal+nowrap" >> $GITHUB_ENV
HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
echo "HCNUMVER=$HCNUMVER" >> $GITHUB_ENV
echo "ARG_TESTS=--enable-tests" >> $GITHUB_ENV
echo "ARG_BENCH=--enable-benchmarks" >> $GITHUB_ENV
echo "HEADHACKAGE=false" >> $GITHUB_ENV
echo "ARG_COMPILER=--ghc --with-compiler=/opt/ghc/$GHC_VERSION/bin/ghc" >> $GITHUB_ENV
echo "GHCJSARITH=0" >> $GITHUB_ENV
env:
GHC_VERSION: ${{ matrix.ghc }}
- name: env
run: |
env
- name: write cabal config
run: |
mkdir -p $CABAL_DIR
cat >> $CABAL_CONFIG <<EOF
remote-build-reporting: anonymous
write-ghc-environment-files: never
remote-repo-cache: $CABAL_DIR/packages
logs-dir: $CABAL_DIR/logs
world-file: $CABAL_DIR/world
extra-prog-path: $CABAL_DIR/bin
symlink-bindir: $CABAL_DIR/bin
installdir: $CABAL_DIR/bin
build-summary: $CABAL_DIR/logs/build.log
store-dir: $CABAL_DIR/store
install-dirs user
prefix: $CABAL_DIR
repository hackage.haskell.org
url: http://hackage.haskell.org/
EOF
cat $CABAL_CONFIG
- name: versions
run: |
$HC --version || true
$HC --print-project-git-commit-id || true
$CABAL --version || true
- name: update cabal index
run: |
$CABAL v2-update -v
- name: install cabal-plan
run: |
mkdir -p $HOME/.cabal/bin
curl -sL https://github.com/haskell-hvr/cabal-plan/releases/download/v0.6.2.0/cabal-plan-0.6.2.0-x86_64-linux.xz > cabal-plan.xz
echo 'de73600b1836d3f55e32d80385acc055fd97f60eaa0ab68a755302685f5d81bc cabal-plan.xz' | sha256sum -c -
xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan
rm -f cabal-plan.xz
chmod a+x $HOME/.cabal/bin/cabal-plan
cabal-plan --version
- name: checkout
uses: actions/checkout@v2
with:
path: source
- name: initial cabal.project for sdist
run: |
touch cabal.project
echo "packages: $GITHUB_WORKSPACE/source/uuid-bench" >> cabal.project
cat cabal.project
- name: sdist
run: |
mkdir -p sdist
$CABAL sdist all --output-dir $GITHUB_WORKSPACE/sdist
- name: unpack
run: |
mkdir -p unpacked
find sdist -maxdepth 1 -type f -name '*.tar.gz' -exec tar -C $GITHUB_WORKSPACE/unpacked -xzvf {} \;
- name: generate cabal.project
run: |
PKGDIR_uuid_bench="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/uuid-bench-[0-9.]*')"
echo "PKGDIR_uuid_bench=${PKGDIR_uuid_bench}" >> $GITHUB_ENV
touch cabal.project
touch cabal.project.local
echo "packages: ${PKGDIR_uuid_bench}" >> cabal.project
if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package uuid-bench" >> cabal.project ; fi
if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
cat >> cabal.project <<EOF
EOF
$HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(uuid-bench)$/; }' >> cabal.project.local
cat cabal.project
cat cabal.project.local
- name: dump install plan
run: |
$CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
cabal-plan
- name: cache
uses: actions/cache@v2
with:
key: ${{ runner.os }}-${{ matrix.ghc }}-${{ github.sha }}
path: ~/.cabal/store
restore-keys: ${{ runner.os }}-${{ matrix.ghc }}-
- name: install dependencies
run: |
$CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all
$CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dependencies-only -j2 all
- name: build w/o tests
run: |
$CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
- name: build
run: |
$CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --write-ghc-environment-files=always
- name: cabal check
run: |
cd ${PKGDIR_uuid_bench} || false
${CABAL} -vnormal check
- name: haddock
run: |
$CABAL v2-haddock $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
- name: unconstrained build
run: |
rm -f cabal.project.local
$CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
2 changes: 1 addition & 1 deletion .github/workflows/haskell-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ jobs:
HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
echo "HCNUMVER=$HCNUMVER" >> $GITHUB_ENV
echo "ARG_TESTS=--enable-tests" >> $GITHUB_ENV
echo "ARG_BENCH=--disable-benchmarks" >> $GITHUB_ENV
echo "ARG_BENCH=--enable-benchmarks" >> $GITHUB_ENV
echo "HEADHACKAGE=false" >> $GITHUB_ENV
echo "ARG_COMPILER=--ghc --with-compiler=/opt/ghc/$GHC_VERSION/bin/ghc" >> $GITHUB_ENV
echo "GHCJSARITH=0" >> $GITHUB_ENV
Expand Down
4 changes: 4 additions & 0 deletions cabal.bench.project
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
-- separate package for benchmarks
-- this way we can build criterion
packages: uuid-bench
benchmarks: True
1 change: 0 additions & 1 deletion cabal.haskell-ci
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
branches: master
benchmarks: False
2 changes: 0 additions & 2 deletions cabal.project
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,10 @@ packages: uuid-types/

package uuid-types
tests: True
benchmarks: False
-- profiling: True
-- profiling-detail: toplevel-functions

package uuid
tests: True
benchmarks: False
-- profiling: True
-- profiling-detail: toplevel-functions
5 changes: 5 additions & 0 deletions haskell-ci.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/sh

# haskell-ci doesn't know how to regenerate multiple GHA workflows
haskell-ci github cabal.project
haskell-ci github --project cabal.bench.project -o .github/workflows/haskell-ci-bench.yml --github-action-name Benchmarks
28 changes: 28 additions & 0 deletions uuid-bench/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
Copyright (c) 2008, Antoine Latter

All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:

* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* 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.
* The names of the authors may not be used to endorse or promote
products derived from this software without specific prior written
permission.

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.
File renamed without changes.
File renamed without changes.
1 change: 1 addition & 0 deletions uuid-bench/src-uuid
1 change: 1 addition & 0 deletions uuid-bench/src-uuid-types
119 changes: 119 additions & 0 deletions uuid-bench/uuid-bench.cabal
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
cabal-version: 1.12
name: uuid-bench
version: 0
copyright:
(c) 2017-2018 Herbert Valerio Riedel
(c) 2008-2014 Antoine Latter

author: Antoine Latter
maintainer: Oleg Grenrus <[email protected]>
license: BSD3
license-file: LICENSE
category: Data
build-type: Simple

-- Benchmarking with older GHCs is not meaningful
tested-with:
GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.4 || ==8.8.4 || ==8.10.3

synopsis: UUID benchmarks
description:
UUID benchmarks.
This package is combined uuid and uuid-types, renamed so we do not
cause benchmark tools to be build against local package.

homepage: https://github.com/haskell-hvr/uuid
bug-reports: https://github.com/haskell-hvr/uuid/issues

source-repository head
type: git
location: https://github.com/haskell-hvr/uuid.git
subdir: uuid-bench

library
build-depends:
base >=4.9 && <5
, binary >=0.4 && <0.9
, bytestring >=0.9 && <0.11
, cryptohash-md5 >=0.11.100 && <0.12
, cryptohash-sha1 >=0.11.100 && <0.12
, deepseq >=1.3 && <1.5
, entropy >=0.3.7 && <0.5
, hashable >=1.2.7.0 && <1.4
, network-info >=0.2 && <0.3
, random >=1.0.1 && <1.2
, text >=1.2.3 && <1.3
, time >=1.1 && <1.12
, uuid-types >=1.0.2 && <2

-- uuid modules
exposed-modules:
Data.UUID
Data.UUID.Util
Data.UUID.V1
Data.UUID.V3
Data.UUID.V4
Data.UUID.V5

other-modules:
Data.UUID.Named
Data.Word.Util

-- uuid-types modules
exposed-modules: Data.UUID.Types

-- Exposed for companion projects; *NOT* part of the official API:
exposed-modules:
Data.UUID.Types.Internal
Data.UUID.Types.Internal.Builder

default-language: Haskell2010
other-extensions:
DeriveDataTypeable
TypeFamilies

ghc-options: -Wall
hs-source-dirs: src-uuid-types src-uuid

benchmark uuid-types-benchmark
type: exitcode-stdio-1.0
main-is: uuid-types-benchmark.hs
hs-source-dirs: bench
default-language: Haskell2010
other-extensions: CPP
ghc-options: -Wall

-- inherited constraints
build-depends:
base
, bytestring
, random
, uuid-bench

-- deps w/o inherited constraints
build-depends:
containers >=0.5 && <0.7
, criterion >=1.5 && <1.6
, unordered-containers >=0.2.7 && <0.3

benchmark uuid-benchmark
type: exitcode-stdio-1.0
main-is: uuid-benchmark.hs
hs-source-dirs: bench
default-language: Haskell2010
default-extensions:
CPP
DeriveDataTypeable

ghc-options: -Wall -fno-warn-orphans

-- inherited constraints
build-depends:
base
, random
, uuid

-- deps w/o inherited constraints
build-depends:
criterion >=1.5 && <1.6
, mersenne-random-pure64 >=0.2 && <0.3
1 change: 1 addition & 0 deletions uuid-types/cabal.project
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
packages: .
14 changes: 0 additions & 14 deletions uuid-types/tests/summarize-bench-results.pl

This file was deleted.

Loading

0 comments on commit 2cea75b

Please sign in to comment.