| // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| library isolate.example.runner_pool; |
| |
| import 'dart:async' show Future; |
| |
| import 'package:isolate/load_balancer.dart'; |
| import 'package:isolate/isolate_runner.dart'; |
| |
| void main() { |
| var N = 44; |
| var sw = Stopwatch()..start(); |
| // Compute fib up to 42 with 4 isolates. |
| parfib(N, 4).then((v1) { |
| var t1 = sw.elapsedMilliseconds; |
| sw.stop(); |
| sw.reset(); |
| print('fib#4($N) = ${v1[N]}, ms: $t1'); |
| sw.start(); |
| // Then compute fib up to 42 with 2 isolates. |
| parfib(N, 2).then((v2) { |
| var t2 = sw.elapsedMilliseconds; |
| sw.stop(); |
| print('fib#2($N) = ${v2[N]}, ms: $t2'); |
| }); |
| }); |
| } |
| |
| // Compute fibonacci 1..limit |
| Future<List<int>> parfib(int limit, int parallelity) { |
| return LoadBalancer.create(parallelity, IsolateRunner.spawn) |
| .then((LoadBalancer pool) { |
| var fibs = List<Future<int>>.filled(limit + 1, null); |
| // Schedule all calls with exact load value and the heaviest task |
| // assigned first. |
| void schedule(a, b, i) { |
| if (i < limit) { |
| schedule(a + b, a, i + 1); |
| } |
| fibs[i] = pool.run<int, int>(fib, i, load: a); |
| } |
| |
| schedule(0, 1, 0); |
| // And wait for them all to complete. |
| return Future.wait(fibs).whenComplete(pool.close); |
| }); |
| } |
| |
| int computeFib(int n) { |
| var result = fib(n); |
| return result; |
| } |
| |
| int fib(int n) { |
| if (n < 2) return n; |
| return fib(n - 1) + fib(n - 2); |
| } |