132 lines
3.1 KiB
JavaScript
132 lines
3.1 KiB
JavaScript
|
// Copyright 2016 the V8 project authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
// found in the LICENSE file.
|
||
|
|
||
|
|
||
|
new BenchmarkSuite('Generators', [1000], [
|
||
|
new Benchmark('Basic', false, false, 0, Basic),
|
||
|
new Benchmark('Loop', false, false, 0, Loop),
|
||
|
new Benchmark('Input', false, false, 0, Input),
|
||
|
new Benchmark('YieldStar', false, false, 0, YieldStar),
|
||
|
]);
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------
|
||
|
// Benchmark: Basic
|
||
|
// ----------------------------------------------------------------------------
|
||
|
|
||
|
function* five() {
|
||
|
yield 1;
|
||
|
yield 2;
|
||
|
yield 3;
|
||
|
yield 4;
|
||
|
yield 5;
|
||
|
}
|
||
|
|
||
|
function Basic() {
|
||
|
let g = five();
|
||
|
let sum = 0;
|
||
|
sum += g.next().value;
|
||
|
sum += g.next().value;
|
||
|
sum += g.next().value;
|
||
|
sum += g.next().value;
|
||
|
sum += g.next().value;
|
||
|
if (sum != 15 || !g.next().done) throw "wrong";
|
||
|
}
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------
|
||
|
// Benchmark: Loop
|
||
|
// ----------------------------------------------------------------------------
|
||
|
|
||
|
function* fibonacci() {
|
||
|
let x = 0;
|
||
|
let y = 1;
|
||
|
yield x;
|
||
|
while (true) {
|
||
|
yield y;
|
||
|
let tmp = x;
|
||
|
x = y;
|
||
|
y += tmp;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function Loop() {
|
||
|
let n = 0;
|
||
|
let x;
|
||
|
for (x of fibonacci()) {
|
||
|
if (++n === 42) break;
|
||
|
}
|
||
|
if (x != 165580141) throw "wrong";
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------
|
||
|
// Benchmark: Input
|
||
|
// ----------------------------------------------------------------------------
|
||
|
|
||
|
function* multiples(x) {
|
||
|
let skip = function.sent || 0;
|
||
|
let next = 0;
|
||
|
while (true) {
|
||
|
if (skip === 0) {
|
||
|
skip = yield next;
|
||
|
} else {
|
||
|
skip--;
|
||
|
}
|
||
|
next += x;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function Input() {
|
||
|
let g = multiples(3);
|
||
|
results = [g.next(2), g.next(0), g.next(5), g.next(10)];
|
||
|
if (results.slice(-1)[0].value != 60) throw "wrong";
|
||
|
}
|
||
|
|
||
|
|
||
|
// ----------------------------------------------------------------------------
|
||
|
// Benchmark: YieldStar
|
||
|
// ----------------------------------------------------------------------------
|
||
|
|
||
|
function* infix(node) {
|
||
|
if (node) {
|
||
|
yield* infix(node.left);
|
||
|
yield node.label;
|
||
|
yield* infix(node.right);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Node {
|
||
|
constructor(label, left, right) {
|
||
|
this.label = label;
|
||
|
this.left = left;
|
||
|
this.right = right;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function YieldStar() {
|
||
|
let tree = new Node(1,
|
||
|
new Node(2,
|
||
|
new Node(3,
|
||
|
new Node(4,
|
||
|
new Node(16,
|
||
|
new Node(5,
|
||
|
new Node(23,
|
||
|
new Node(0),
|
||
|
new Node(17)),
|
||
|
new Node(44, new Node(20)))),
|
||
|
new Node(7,
|
||
|
undefined,
|
||
|
new Node(23,
|
||
|
new Node(0),
|
||
|
new Node(41, undefined, new Node(11))))),
|
||
|
new Node(8)),
|
||
|
new Node(5)),
|
||
|
new Node(6, undefined, new Node(7)));
|
||
|
let labels = [...(infix(tree))];
|
||
|
// 0,23,17,5,20,44,16,4,7,0,23,41,11,3,8,2,5,1,6,7
|
||
|
if (labels[0] != 0) throw "wrong";
|
||
|
}
|