All Projects → biboudis → streamalg

biboudis / streamalg

Licence: Apache-2.0 license
Extensible stream pipelines with object algebras.

Programming Languages

java
68154 projects - #9 most used programming language
C#
18002 projects
scala
5932 projects
shell
77523 projects

Projects that are alternatives of or similar to streamalg

queueable
Convert streams to async ⌛ iterables ➰
Stars: ✭ 43 (+65.38%)
Mutual labels:  iteration, streams
Labeled Stream Splicer
stream splicer with labels
Stars: ✭ 37 (+42.31%)
Mutual labels:  pipeline, streams
bash-streams-handbook
💻 Learn Bash streams, pipelines and redirection, from beginner to advanced.
Stars: ✭ 153 (+488.46%)
Mutual labels:  pipeline, streams
Stream Splicer
streaming pipeline with a mutable configuration
Stars: ✭ 52 (+100%)
Mutual labels:  pipeline, streams
Go Streams
A lightweight stream processing library for Go
Stars: ✭ 615 (+2265.38%)
Mutual labels:  pipeline, streams
httpit
A rapid http(s) benchmark tool written in Go
Stars: ✭ 156 (+500%)
Mutual labels:  benchmark, pipeline
tpack
Pack a Go workflow/function as a Unix-style pipeline command
Stars: ✭ 55 (+111.54%)
Mutual labels:  pipeline
rmonad
Pipelines you can compute on
Stars: ✭ 66 (+153.85%)
Mutual labels:  pipeline
moros
A modern http(s) benchmark tool
Stars: ✭ 14 (-46.15%)
Mutual labels:  benchmark
naas
⚙️ Schedule notebooks, run them like APIs, expose securely your assets: Jupyter as a viable ⚡️ Production environment
Stars: ✭ 219 (+742.31%)
Mutual labels:  pipeline
dagshub-branch-source-plugin
Jenkins plugin for using DAGsHub as a source for multibranch projects
Stars: ✭ 12 (-53.85%)
Mutual labels:  pipeline
cmdc
Maya Python API 3.0
Stars: ✭ 98 (+276.92%)
Mutual labels:  pipeline
bactmap
A mapping-based pipeline for creating a phylogeny from bacterial whole genome sequences
Stars: ✭ 36 (+38.46%)
Mutual labels:  pipeline
artifact-promotion-plugin
A simple Jenkins plugin to promote artifacts.
Stars: ✭ 29 (+11.54%)
Mutual labels:  pipeline
async-stream-generator
Pipe ES6 Async Generators through Node.js Streams
Stars: ✭ 48 (+84.62%)
Mutual labels:  streams
QASMBench
QASMBench is an OpenQASM benchmark suite running on IBM Quantum-Experience backends.
Stars: ✭ 22 (-15.38%)
Mutual labels:  benchmark
ngs-preprocess
A pipeline for preprocessing NGS data from Illumina, Nanopore and PacBio technologies
Stars: ✭ 22 (-15.38%)
Mutual labels:  pipeline
compbench
⌛ Benchmark and visualization of various compression algorithms
Stars: ✭ 21 (-19.23%)
Mutual labels:  benchmark
JavaSE8-Features
Take a tour of the new features in Java SE 8, the platform designed to support faster and easier Java development. Learn about Project Lambda, a new syntax to support lambda expressions in Java code; the new Stream API for processing collections and managing parallel processing; the DateTime API for representing, managing and calculating date an…
Stars: ✭ 51 (+96.15%)
Mutual labels:  streams
DiscEval
Discourse Based Evaluation of Language Understanding
Stars: ✭ 18 (-30.77%)
Mutual labels:  benchmark

StreamAlg

Build Status

The StreamAlg repository contains the source code artifact that accompanies the Streams à la carte: Extensible Pipelines with Object Algebras paper, to appear at the 29th European Conference on Object-Oriented Programming (ECOOP'15).

Overview

We address extensibility shortcomings in libraries for lazy-streaming queries with a new design. The architecture underlying this design borrows heavily from Oliveira and Cook's object algebra solution to the expression problem, extended with a design that exposes the push/pull character of the iteration, and an encoding of higher-kinded polymorphism.

In this library we apply our design to Java and show that the addition of full extensibility is accompanied by high performance, matching or exceeding that of the original, highly-optimized Java streams library.

In this repository we present a fundamental set of sequential operators map, filter, reduce, count, take/limit and iterate.

Additionally we present the behaviors that are discussed in the paper: push, pull, fused pull, logging, id (for blocking terminal operators), future (for non-blocking terminal operators).

Getting Started

Prerequisites

The project runs with Java 8.

Testing

Clone the project:

git clone [email protected]:biboudis/streamalg.git

The project is built with maven and its dependencies are automatically resolved: Guava, JMH and JUnit. To run the test suite simply run:

mvn test

The tests cover all examples included in the paper (operators, behaviors) and cases used as motivation as well. The streams package is covered at: 87% classes, 90% methods, 91% lines.

Running Benchmarks

Benchmarks are reproduced by executing:

sh run_benchmarks.sh

Project Structure

The basic packages of this artifact are the following:

Object Algebras

  • StreamAlg: describes the object algebra of the intermediate operators of streams.
  • TakeStreamAlg: adds to streams the take combinator.
  • ExecStreamAlg: adds to streams the terminal operators.
  • ExecIterateStreamAlg: adds to streams the iterate terminal operator.
  • ExecTakeStreamAlg: unifies terminal operators with the algebra with the take combinator.

Factories

The following factories implement different combinations of behaviors:

  • ExecFusedPullFactory
  • ExecFutureFactory
  • ExecPullFactory
  • ExecPullWithIterateFactory
  • ExecPullWithTakeFactory
  • ExecPushFactory
  • ExecPushWithTakeFactory
  • LogFactory
  • PullFactory
  • PushFactory

Higher Kinded types

The types that participate in higher-kinded polymorphism scenarios are: Future, Id, Pull and Push.

GADT encoding

The encoding appears in the gadt.evaluator package.

Fluent APIs

In streamalg/fluent/Stream.cs and streamalg/fluent/Stream.scala we describe a possible solution of obtaining fluent APIs of Streams a la carte in C# and Scala.

Benchmarks

The run_benchmarks.sh script simply builds the JMH benchmarks über-jar and then uses the command line interface of JMH to pass the arguments of the experiments. The script will run all benchmarks in streamalg/src/main/java/benchmarks/* and their description is included in the paper. The user can run the benchmark script as is or by passing a regular-expression for filter to select only some of them. The micro-benchmark suite can be passed the number of elements N for map, count, operations with large number of elements, N_small that is used for cart and limit/take examples. N_limit is used as the parameter for limit and F is used for benchmarks with fused pipelines.

For more information on JMH the user can run it directly, e.g., to get the help dialog java -jar target/microbenchmarks.jar -h.

We omitted baseline tests from the paper (although we included them in the repo) as the focus of the paper is not on comparing hand-optimized tight loops with streaming pipelines. We have investigated this in previous work (http://arxiv.org/abs/1406.6631) and it is something that we would like to investigate about the OpenJDK specifically in the immediate future.

We include three basic categories of benchmarks: basic pipelines with various combinations about both Pull and Push algebras, fused pipelines to exercise map and filter fusion and help with the comparison between the non-fused pipelines, iterator pipelines to demonstrate differences of the Pull algebra and the obtaining of an iterator from Java 8 Streams and take pipelines (the take operator is the same as the limit operator in Java 8 Streams).

Team

Aggelos Biboudis (@biboudis), Nick Palladinos (@NickPalladinos), George Fourtounis (@gf0ur) and Yannis Smaragdakis (@YSmaragdakis).

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].