https://github.com/co-log/co-log-benchmarks
🏎 Benchmarks of the co-log logging library
https://github.com/co-log/co-log-benchmarks
benchmarks co-log hacktoberfest haskell logging
Last synced: over 1 year ago
JSON representation
🏎 Benchmarks of the co-log logging library
- Host: GitHub
- URL: https://github.com/co-log/co-log-benchmarks
- Owner: co-log
- License: mpl-2.0
- Created: 2021-10-02T18:25:20.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2025-03-21T05:41:00.000Z (over 1 year ago)
- Last Synced: 2025-03-21T06:29:23.108Z (over 1 year ago)
- Topics: benchmarks, co-log, hacktoberfest, haskell, logging
- Language: Haskell
- Homepage:
- Size: 61.5 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Codeowners: .github/CODEOWNERS
Awesome Lists containing this project
README
# co-log

[](https://github.com/kowainik/co-log/actions)
[](https://travis-ci.org/kowainik/co-log)
[](https://ci.appveyor.com/project/kowainik/co-log)
[](https://github.com/kowainik/co-log/blob/main/LICENSE)
| | | | |
| :------------ | :--------------------------------- | :---------------------------------------- | :---------------------------------------------------- |
| `co-log-core` | [![Hackage][hk-img-core]][hk-core] | [![Stackage LTS][lts-img-core]][lts-core] | [![Stackage Nightly][nightly-img-core]][nightly-core] |
| `co-log` | [![Hackage][hk-img]][hk] | [![Stackage LTS][lts-img]][lts] | [![Stackage Nightly][nightly-img]][nightly] |
| `co-log-polysemy` | [![Hackage][hk-img-ps]][hk-ps] | [![Stackage LTS][lts-img-ps]][lts-ps] | [![Stackage Nightly][nightly-img-ps]][nightly-ps] |
`co-log` is a composable and configurable logging framework. It
combines all the benefits of Haskell idioms to provide a reasonable
and convenient interface. Though it uses some advanced concepts in its
core, we are striving to provide beginner-friendly API. The library
also contains complete documentation with a lot of beginner-friendly
examples, explanations and tutorials to guide users. The combination
of a pragmatic approach to logging and fundamental Haskell abstractions
allows us to create a highly composable and configurable logging
framework.
If you're interested in how different Haskell typeclasses are used to
implement core functions of `co-log`, you can read the following blog
post which goes into detail about internal implementation specifics:
* [co-log: Composable Contravariant Combinatorial Comonadic Configurable Convenient Logging](https://kowainik.github.io/posts/2018-09-25-co-log)
`co-log` is also modular on the level of packages. We care a lot about a
low dependency footprint so you can build your logging only on top of
the minimal required interface for your use-case. This repository contains
the following packages:
* [`co-log-core`](co-log-core): lightweight package with basic data types and
general idea which depends only on `base`.
* [`co-log`](co-log): taggless final implementation of logging library based on
`co-log-core`.
* [`co-log-polysemy`](co-log-polysemy): implementation of logging library based
on `co-log-core` and the [`polysemy`](http://hackage.haskell.org/package/polysemy) extensible effects library.
* [`co-log-benchmark`](co-log-benchmark): benchmarks of the `co-log` library.
To provide a more user-friendly introduction to the library, we've
created the tutorial series which introduces the main concepts behind `co-log`
smoothly:
* [Intro: Using `LogAction`](https://github.com/kowainik/co-log/blob/main/co-log/tutorials/1-intro/Intro.md)
* [Using custom monad that stores `LogAction` inside its environment](https://github.com/kowainik/co-log/blob/main/co-log/tutorials/2-custom/Custom.md)
`co-log` also cares about concurrent logging. For this purpose we have the `concurrent-playground`
executable where we experiment with different multithreading scenarios to test the library's behavior.
You can find it here:
* [tutorials/Concurrent.hs](co-log/tutorials/Concurrent.hs)
## Benchmarks
`co-log` is compared with basic functions like `putStrLn`. Since IO overhead is
big enough, every benchmark dumps 10K messages to output. If a benchmark's name
doesn't contain `Message` then this benchmark simply dumps the string `"message"`
to output, otherwise it works with the `Message` data type from the `co-log`
library.
To run benchmarks, use the following command:
```
cabal v2-run co-log-bench -- --svg bench.svg &> /dev/null
```
**Time for 10K messages:**

[hk-img]: https://img.shields.io/hackage/v/co-log.svg?logo=haskell
[hk-img-ps]: https://img.shields.io/hackage/v/co-log-polysemy.svg?logo=haskell
[hk-img-core]: https://img.shields.io/hackage/v/co-log-core.svg?logo=haskell
[hk]: https://hackage.haskell.org/package/co-log
[hk-ps]: https://hackage.haskell.org/package/co-log-polysemy
[hk-core]: https://hackage.haskell.org/package/co-log-core
[lts-img]: http://stackage.org/package/co-log/badge/lts
[lts-img-ps]: http://stackage.org/package/co-log-polysemy/badge/lts
[lts-img-core]: http://stackage.org/package/co-log-core/badge/lts
[lts]: http://stackage.org/lts/package/co-log
[lts-ps]: http://stackage.org/lts/package/co-log-polysemy
[lts-core]: http://stackage.org/lts/package/co-log-core
[nightly-img]: http://stackage.org/package/co-log/badge/nightly
[nightly-img-ps]: http://stackage.org/package/co-log-polysemy/badge/nightly
[nightly-img-core]: http://stackage.org/package/co-log-core/badge/nightly
[nightly]: http://stackage.org/nightly/package/co-log
[nightly-ps]: http://stackage.org/nightly/package/co-log-polysemy
[nightly-core]: http://stackage.org/nightly/package/co-log-core