packages feed

blockio-0.1.0.1: README.md

# blockio

Perform batches of disk I/O operations. Performing batches of disk I/O can lead
to performance improvements over performing each disk I/O operation
individually. Performing batches of disk I/O *concurrently* can lead to an even
bigger performance improvement depending on the implementation of batched I/O.

The batched I/O functionality in the library is separated into an *abstract
interface* and *implementations* of that abstract interface. The advantage of
programming against an abstract interface is that code can be agnostic to the
implementation of the interface, allowing implementations to be freely swapped
out. The library provides multiple implementations of batched I/O:
platform-dependent implementations using the *real* file system (using
asynchronous I/O), and a simulated implementation for testing purposes.

See the `System.FS.BlockIO` module for an example of how to use the library.

On Linux systems the *real* implementation is backed by
[blockio-uring](https://hackage.haskell.org/package/blockio-uring), a library
for asynchronous I/O that achieves good performance when performing batches
concurrently. On Windows and MacOS systems the *real* implementation currently
simply performs each I/O operation sequentially, which should achieve about the
same performance as using non-batched I/O, but the library could be extended
with asynchronous I/O implementations for Windows and MacOS as well. The
simulated implementation also performs each I/O operation sequentially.

As mentioned before, the batched I/O functionality is separated into an
*abstract interface* and *implementations* of that abstract interface. The
advantage of programming against an abstract interface is that code can be
agnostic to the implementation of the interface. For example, we could run code
in production using the real file system, but we could also run the same code in
a testing environment using a simulated file system. We could even switch from a
default implementation to a more performant implementation in production if the
performant implementation is available. Lastly, the abstract interface allows us
to program against the file system in a uniform manner across different
platforms, i.e., operating systems.

The `blockio` library defines the abstract interface for batched I/O. The
library is an extension of the
[fs-api](https://hackage.haskell.org/package/fs-api) library, which defines an
abstract interface for (basic) file system I/O. Both `blockio` and `fs-api`
provide an implementation of their interfaces using the real file system in
`IO`.

The `blockio:sim` sub-library defines an implementation of the abstract
interface from `blockio` that *simulates* batched I/O. This sub-library is an
extension of the [fs-sim](https://hackage.haskell.org/package/fs-sim) library,
which defines an implementation of the abstract interface from `fs-api` that
simulates (basic) file system I/O.