123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- import * as B from 'benchmark'
- import It from '../mol-base/collections/iterator'
- function createData(n: number) {
- const data = [];//new Int32Array(n);
- let last = (15 * Math.random()) | 0;
- for (let i = 0; i < n; i++) {
- data[i] = last;
- last += (15 * Math.random()) | 0;
- }
- return data;
- }
- export namespace Iterators {
- const data = createData(100000);
- export function forLoop() {
- let sum = 0;
- for (let i = 0, _i = data.length; i < _i; i++) {
- sum += data[i];
- }
- return sum;
- }
- export function forOf() {
- let sum = 0;
- for (const e of data) {
- sum += e;
- }
- return sum;
- }
- export function forEach() {
- const ctx = { sum: 0 };
- data.forEach(function (this: typeof ctx, v: number) { this.sum += v }, ctx);
- return ctx.sum;
- }
- export function forEachAllParams() {
- const ctx = { sum: 0 };
- data.forEach(function (this: typeof ctx, v: number, _: any, __: any) { this.sum += v }, ctx);
- return ctx.sum;
- }
- export function forEachClosure() {
- let sum = 0;
- data.forEach(v => sum += v);
- return sum;
- }
- export function forEachClosureAll() {
- let sum = 0;
- data.forEach((v, _, __) => sum += v);
- return sum;
- }
- export function forEachClosureAllFunction() {
- let sum = 0;
- data.forEach(function (v, _, __) { sum += v });
- return sum;
- }
- interface ES6Iterator {
- [Symbol.iterator](): ES6Iterator,
- done: boolean;
- value: number;
- next(): { done: boolean, value: number }
- reset(data: any[]): ES6Iterator;
- }
- class _MutableES6Iterator implements ES6Iterator {
- done = true;
- value = 0;
- private xs: any[] = void 0 as any;
- private index: number = -1;
- private length: number = 0;
- [Symbol.iterator]() { return this };
- next() {
- const index = ++this.index;
- if (index < this.length) this.value = this.xs[index];
- else this.done = true;
- return this;
- }
- reset(xs: any[]) {
- this.value = xs[0];
- this.length = xs.length;
- this.done = false;
- this.xs = xs;
- this.index = -1;
- return this;
- }
- }
- class _ImmutableES6Iterator implements ES6Iterator {
- done = true;
- value = 0;
- private xs: any[] = void 0 as any;
- private index: number = -1;
- private length: number = 0;
- [Symbol.iterator]() { return this };
- next() {
- const index = ++this.index;
- if (index < this.length) this.value = this.xs[index];
- else this.done = true;
- return { done: this.done, value: this.value };
- }
- reset(xs: any[]) {
- this.value = xs[0];
- this.length = xs.length;
- this.done = false;
- this.xs = xs;
- this.index = -1;
- return this;
- }
- }
- export function mutableES6Iterator() {
- const it = new _MutableES6Iterator();
- let sum = 0;
- for (let e = it.reset(data).next().value; !it.done; e = it.next().value) {
- sum += e;
- }
- return sum;
- }
- // export function mutableES6IteratorOf() {
- // const it = new _ImmutableES6Iterator();
- // let sum = 0;
- // for (const e of it.reset(data)) {
- // sum += e;
- // }
- // return sum;
- // }
- export function immutableES6Iterator() {
- const it = new _ImmutableES6Iterator();
- let sum = 0;
- it.reset(data);
- while (true) {
- const { value, done } = it.next();
- if (done) break;
- sum += value;
- }
- return sum;
- }
- // export function immutableES6IteratorOf() {
- // const it = new _MutableES6Iterator();
- // let sum = 0;
- // for (const e of it.reset(data)) {
- // sum += e;
- // }
- // return sum;
- // }
- interface MutableIterator {
- done: boolean;
- next(): number;
- start(data: any[]): number;
- }
- class _MutableIterator implements MutableIterator {
- done = true;
- private xs: any[] = void 0 as any;
- private index: number = -1;
- private length: number = 0;
- next() {
- const index = ++this.index;
- if (index < this.length) return this.xs[index];
- else {
- this.done = true;
- return 0;
- }
- }
- start(xs: any[]) {
- this.length = xs.length;
- this.done = !this.length;
- this.xs = xs;
- this.index = 0;
- return this.done ? 0 : this.xs[0];
- }
- }
- export function mutableIterator() {
- const it = new _MutableIterator();
- let sum = 0;
- for (let e = it.start(data); !it.done; e = it.next()) {
- sum += e;
- }
- return sum;
- }
- export function run() {
- const suite = new B.Suite();
- suite
- .add('for', () => Iterators.forLoop())
- .add('forOf', () => Iterators.forOf())
- .add('forEach', () => Iterators.forEach())
- .add('forEach all params', () => Iterators.forEachAllParams())
- .add('forEachClosure', () => Iterators.forEachClosure())
- .add('forEachClosure all', () => Iterators.forEachClosureAll())
- .add('forEachClosure all function', () => Iterators.forEachClosureAllFunction())
- .add('mutableIterator ES6', () => Iterators.mutableES6Iterator())
- //.add('mutableIteratorOf ES6', () => Iterators.mutableES6IteratorOf())
- .add('immutableIterator ES6', () => Iterators.immutableES6Iterator())
- //.add('immutableIteratorOf ES6', () => Iterators.immutableES6IteratorOf())
- .add('mutableIterator', () => Iterators.mutableIterator())
- .on('cycle', (e: any) => {
- console.log(String(e.target));
- })
- // .on('complete', function (this: any) {
- // console.log('Fastest is ' + this.filter('fastest').map('name'));
- // })
- .run();
- }
- }
- const it = It.Array([1, 2, 3]);
- while (it.hasNext) {
- console.log(it.move());
- }
|