Skip to content
Snippets Groups Projects
Select Git revision
  • c5a99a7c128ab993805d7eba33324fd63ee6bde1
  • master default protected
  • rednatco-v2
  • rednatco
  • test
  • ntc-tube-uniform-color
  • ntc-tube-missing-atoms
  • restore-vertex-array-per-program
  • watlas2
  • dnatco_new
  • cleanup-old-nodejs
  • webmmb
  • fix_auth_seq_id
  • update_deps
  • ext_dev
  • ntc_balls
  • nci-2
  • plugin
  • bugfix-0.4.5
  • nci
  • servers
  • v0.5.0-dev.1
  • v0.4.5
  • v0.4.4
  • v0.4.3
  • v0.4.2
  • v0.4.1
  • v0.4.0
  • v0.3.12
  • v0.3.11
  • v0.3.10
  • v0.3.9
  • v0.3.8
  • v0.3.7
  • v0.3.6
  • v0.3.5
  • v0.3.4
  • v0.3.3
  • v0.3.2
  • v0.3.1
  • v0.3.0
41 results

units-representation.ts

  • iterators.ts 6.28 KiB
    import * as B from 'benchmark'
    import It from 'mol-data/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());
    }