From 4a39a38967905c674bfec1c1637f11f2561c2481 Mon Sep 17 00:00:00 2001 From: David Sehnal <david.sehnal@gmail.com> Date: Tue, 17 Oct 2017 14:13:33 +0200 Subject: [PATCH] iterator benchmarks --- package-lock.json | Bin 141339 -> 165468 bytes package.json | 10 +- src/perf-tests/iterators.ts | 227 ++++++++++++++++++++++++++++++++++++ tsconfig.json | 3 +- 4 files changed, 235 insertions(+), 5 deletions(-) create mode 100644 src/perf-tests/iterators.ts diff --git a/package-lock.json b/package-lock.json index 65edb5b9cf7b351137a82ca276ff669f2ff6c1ec..fbf52d4b90d0f4e49c73635a1e0e111e5f3bff45 100644 GIT binary patch delta 13461 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 delta 3751 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 G<pKb;V(MQ2 diff --git a/package.json b/package.json index ae74e31e7..a024c3177 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "test": "./node_modules/.bin/jest", "dist": "./node_modules/.bin/uglifyjs build/js/molio.dev.js -cm > dist/molio.js && cp build/js/molio.esm.js dist/molio.esm.js", "script": "./node_modules/.bin/rollup build/js/src/script.js -e fs -f cjs -o build/js/script.js", - "runscript": "npm run script && node build/js/script.js", + "runscript": "node build/js/src/script.js", "download-dics": "./node_modules/.bin/download -o build/dics http://mmcif.wwpdb.org/dictionaries/ascii/mmcif_pdbx_v50.dic && ./node_modules/.bin/download -o build/dics http://mmcif.wwpdb.org/dictionaries/ascii/mmcif_ddl.dic" }, "jest": { @@ -29,8 +29,10 @@ "author": "", "license": "MIT", "devDependencies": { - "@types/jest": "^21.1.2", - "@types/node": "^8.0.34", + "@types/benchmark": "^1.0.30", + "@types/jest": "^21.1.3", + "@types/node": "^8.0.41", + "benchmark": "^2.1.4", "download-cli": "^1.0.5", "jest": "^21.2.1", "rollup": "^0.50.0", @@ -42,7 +44,7 @@ "ts-jest": "^21.1.2", "tslint": "^5.7.0", "typescript": "^2.5.3", - "uglify-js": "^3.1.3", + "uglify-js": "^3.1.4", "util.promisify": "^1.0.0" }, "dependencies": {} diff --git a/src/perf-tests/iterators.ts b/src/perf-tests/iterators.ts new file mode 100644 index 000000000..78cfac0a3 --- /dev/null +++ b/src/perf-tests/iterators.ts @@ -0,0 +1,227 @@ +import * as B from 'benchmark' + +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; +} + +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; + } +} + + +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(); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 21016d562..be84a2ed2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,13 @@ { "compilerOptions": { - "target": "es6", + "target": "es5", "alwaysStrict": true, "noImplicitAny": true, "noImplicitThis": true, "sourceMap": false, "noUnusedLocals": true, "strictNullChecks": true, + //"downlevelIteration": true, "lib": [ "es6", "dom" ], "outDir": "build/js/src" }, -- GitLab