# Parallel map for Dart

Dart programs run in a single isolate by default. Although Dart provides several asynchronous programming techniques like Futures and Streams Dart does not use capacities of modern multicore processors by default.

This package provides a parallel map function <code>pmap</code> for easy parallelization. Let us assume you want to execute computational intensive tasks in parallel.

For example applying the fibonacci function

```
int fib(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
return fib(n-1) + fib(n-2);
}
```

to a list of values

```
final vs = [40, 41, 42, 43, 44, 45];
```

you can do this like that.

```
// We have to define a wannabe function
class FibFunc() {
int call(int n) => fib(n);
}
void main() {
final vs = [40, 41, 42, 43, 44, 45];
final sum = parallel(vs).pmap(new FibFunc())
.then((result) => print(result));
}
```

you will get this result.

```
[102334155, 165580141, 267914296, 433494437, 701408733, 1134903170]
```

which are the fibonacci values of `40, 41, 42, 43, 44, 45`

**processed in parallel**.

We can even combine the parallel map with normal methods applyable to iterables.

Let's say we want to calculate the sum fibonacci numbers from 1 to 45 in parallel we can do the following:

```
final vs = new Iterable.generate(45, (i) => i + 1);
parallel(vs).pmap(new FibFunc())
.reduce((a, b) => a + b)
.then((r) {
print(r);
});
```

and will get the following result (computed in parallel):

```
2971215072
```

You can run the following code to check that pmap is really faster (on multicore systems).

```
final stopwatch = new Stopwatch();
final vs = new Iterable.generate(45, (i) => i + 1);
print("sum of fib on $vs using classical map");
stopwatch.start();
print(vs.map((n) => fib(n)).reduce((a, b) => a + b));
stopwatch.stop();
print("Elapsed time: ${stopwatch.elapsed}");
print("sum of fib on $vs using parallel map");
stopwatch..reset()..start();
parallel(vs).pmap(new FibFunc())
.reduce((a, b) => a + b)
.then((r) {
print(r);
stopwatch.stop();
print("Elapsed time: ${stopwatch.elapsed}");
});
```

## Changelog

**Version 0.0.4**Changed map to pmap. You can now control whether you want the sequential or the parallel map.