From b9aa4cdd71b550146bbfc1952e0484a9be2fc760 Mon Sep 17 00:00:00 2001 From: Yuanle Song <sylecn@gmail.com> Date: Sat, 17 Dec 2016 20:58:02 +0800 Subject: [PATCH] add haskell postgresql-simple benchmark --- README.org | 20 +++++++- haskell-postgres-simple/Bench.hs | 32 +++++++++++++ haskell-postgres-simple/LICENSE | 30 ++++++++++++ haskell-postgres-simple/README.md | 1 + haskell-postgres-simple/Setup.hs | 2 + haskell-postgres-simple/dbbench.cabal | 27 +++++++++++ haskell-postgres-simple/stack.yaml | 66 +++++++++++++++++++++++++++ 7 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 haskell-postgres-simple/Bench.hs create mode 100644 haskell-postgres-simple/LICENSE create mode 100644 haskell-postgres-simple/README.md create mode 100644 haskell-postgres-simple/Setup.hs create mode 100644 haskell-postgres-simple/dbbench.cabal create mode 100644 haskell-postgres-simple/stack.yaml diff --git a/README.org b/README.org index e566d21..2517594 100644 --- a/README.org +++ b/README.org @@ -1,6 +1,6 @@ * COMMENT -*- mode: org -*- #+Date: 2016-12-16 -Time-stamp: <2016-12-16> +Time-stamp: <2016-12-17> * database binding benchmark I want to know the efficiency of the db binding for different language, @@ -39,3 +39,21 @@ https://www.postgresql.org/docs/9.4/static/libpq.html 26.2 //side note: why adding -shared in LDFLAGS will just segfault the program? +** postgres 9.4, lts-7.13, ghc 8.0.1, postgresql-simple +0.71 +27.5 +-- +0.63 +27.2 +-- +0.61 +26.2 +** postgres 9.4, lts-5.18, ghc 7.10.3, postgresql-simple +0.61 +26.6 +-- +0.59 +26.8 +-- +0.63 +26.6 diff --git a/haskell-postgres-simple/Bench.hs b/haskell-postgres-simple/Bench.hs new file mode 100644 index 0000000..bfdb7f9 --- /dev/null +++ b/haskell-postgres-simple/Bench.hs @@ -0,0 +1,32 @@ +module Main where + +import Control.Monad +import Text.Printf +import Data.Time.Clock +import Database.PostgreSQL.Simple + +times :: Int +times = 3000 + +selectTest :: Connection -> IO () +selectTest conn = do + replicateM_ times (query_ conn "SELECT id, bar FROM foo" :: IO [(Int, Int)]) + +updateTest :: Connection -> IO () +updateTest conn = + replicateM_ times $ execute_ conn "UPDATE foo SET bar=bar+1 WHERE id=1" + +timeit :: IO a -> IO a +timeit action = do + start <- getCurrentTime + r <- action + end <- getCurrentTime + printf "seconds: %f\n" (realToFrac $ diffUTCTime end start :: Double) + return r + +main :: IO () +main = do + conn <- connectPostgreSQL "host=localhost dbname=t1 user=t1 password=fNfwREMqO69TB9YqE+/OzF5/k+s=" + timeit $ selectTest conn + timeit $ updateTest conn + close conn diff --git a/haskell-postgres-simple/LICENSE b/haskell-postgres-simple/LICENSE new file mode 100644 index 0000000..04f804e --- /dev/null +++ b/haskell-postgres-simple/LICENSE @@ -0,0 +1,30 @@ +Copyright Yuanle Song (c) 2016 + +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. + + * Neither the name of Yuanle Song nor the names of other + contributors may 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. \ No newline at end of file diff --git a/haskell-postgres-simple/README.md b/haskell-postgres-simple/README.md new file mode 100644 index 0000000..610f3d7 --- /dev/null +++ b/haskell-postgres-simple/README.md @@ -0,0 +1 @@ +test postgres-simple db binding diff --git a/haskell-postgres-simple/Setup.hs b/haskell-postgres-simple/Setup.hs new file mode 100644 index 0000000..9a994af --- /dev/null +++ b/haskell-postgres-simple/Setup.hs @@ -0,0 +1,2 @@ +import Distribution.Simple +main = defaultMain diff --git a/haskell-postgres-simple/dbbench.cabal b/haskell-postgres-simple/dbbench.cabal new file mode 100644 index 0000000..f2ea231 --- /dev/null +++ b/haskell-postgres-simple/dbbench.cabal @@ -0,0 +1,27 @@ +name: dbbench +version: 0.1.0.0 +synopsis: Initial project template from stack +description: Please see README.md +homepage: https://github.com/sylecn/dbbench#readme +license: BSD3 +license-file: LICENSE +author: Yuanle Song +maintainer: sylecn@gmail.com +copyright: Copyright: (c) 2016 Yuanle Song +category: Utilities +build-type: Simple +extra-source-files: README.md +cabal-version: >=1.10 + +executable bench + main-is: Bench.hs + ghc-options: -threaded -rtsopts -with-rtsopts=-N + build-depends: base + , postgresql-simple + , time + default-language: Haskell2010 + default-extensions: OverloadedStrings + +source-repository head + type: git + location: https://github.com/sylecn/dbbench diff --git a/haskell-postgres-simple/stack.yaml b/haskell-postgres-simple/stack.yaml new file mode 100644 index 0000000..ecf897a --- /dev/null +++ b/haskell-postgres-simple/stack.yaml @@ -0,0 +1,66 @@ +# This file was automatically generated by 'stack init' +# +# Some commonly used options have been documented as comments in this file. +# For advanced use and comprehensive documentation of the format, please see: +# http://docs.haskellstack.org/en/stable/yaml_configuration/ + +# Resolver to choose a 'specific' stackage snapshot or a compiler version. +# A snapshot resolver dictates the compiler version and the set of packages +# to be used for project dependencies. For example: +# +# resolver: lts-3.5 +# resolver: nightly-2015-09-21 +# resolver: ghc-7.10.2 +# resolver: ghcjs-0.1.0_ghc-7.10.2 +# resolver: +# name: custom-snapshot +# location: "./custom-snapshot.yaml" +resolver: lts-5.18 + +# User packages to be built. +# Various formats can be used as shown in the example below. +# +# packages: +# - some-directory +# - https://example.com/foo/bar/baz-0.0.2.tar.gz +# - location: +# git: https://github.com/commercialhaskell/stack.git +# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a +# - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a +# extra-dep: true +# subdirs: +# - auto-update +# - wai +# +# A package marked 'extra-dep: true' will only be built if demanded by a +# non-dependency (i.e. a user package), and its test suites and benchmarks +# will not be run. This is useful for tweaking upstream packages. +packages: +- '.' +# Dependency packages to be pulled from upstream that are not in the resolver +# (e.g., acme-missiles-0.3) +extra-deps: [] + +# Override default flag values for local packages and extra-deps +flags: {} + +# Extra package databases containing global packages +extra-package-dbs: [] + +# Control whether we use the GHC we find on the path +# system-ghc: true +# +# Require a specific version of stack, using version ranges +# require-stack-version: -any # Default +# require-stack-version: ">=1.3" +# +# Override the architecture used by stack, especially useful on Windows +# arch: i386 +# arch: x86_64 +# +# Extra directories used by stack for building +# extra-include-dirs: [/path/to/dir] +# extra-lib-dirs: [/path/to/dir] +# +# Allow a newer minor version of GHC than the snapshot specifies +# compiler-check: newer-minor -- GitLab