iterators.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. import * as B from 'benchmark'
  2. import It from '../mol-base/collections/iterator'
  3. function createData(n: number) {
  4. const data = [];//new Int32Array(n);
  5. let last = (15 * Math.random()) | 0;
  6. for (let i = 0; i < n; i++) {
  7. data[i] = last;
  8. last += (15 * Math.random()) | 0;
  9. }
  10. return data;
  11. }
  12. export namespace Iterators {
  13. const data = createData(100000);
  14. export function forLoop() {
  15. let sum = 0;
  16. for (let i = 0, _i = data.length; i < _i; i++) {
  17. sum += data[i];
  18. }
  19. return sum;
  20. }
  21. export function forOf() {
  22. let sum = 0;
  23. for (const e of data) {
  24. sum += e;
  25. }
  26. return sum;
  27. }
  28. export function forEach() {
  29. const ctx = { sum: 0 };
  30. data.forEach(function (this: typeof ctx, v: number) { this.sum += v }, ctx);
  31. return ctx.sum;
  32. }
  33. export function forEachAllParams() {
  34. const ctx = { sum: 0 };
  35. data.forEach(function (this: typeof ctx, v: number, _: any, __: any) { this.sum += v }, ctx);
  36. return ctx.sum;
  37. }
  38. export function forEachClosure() {
  39. let sum = 0;
  40. data.forEach(v => sum += v);
  41. return sum;
  42. }
  43. export function forEachClosureAll() {
  44. let sum = 0;
  45. data.forEach((v, _, __) => sum += v);
  46. return sum;
  47. }
  48. export function forEachClosureAllFunction() {
  49. let sum = 0;
  50. data.forEach(function (v, _, __) { sum += v });
  51. return sum;
  52. }
  53. interface ES6Iterator {
  54. [Symbol.iterator](): ES6Iterator,
  55. done: boolean;
  56. value: number;
  57. next(): { done: boolean, value: number }
  58. reset(data: any[]): ES6Iterator;
  59. }
  60. class _MutableES6Iterator implements ES6Iterator {
  61. done = true;
  62. value = 0;
  63. private xs: any[] = void 0 as any;
  64. private index: number = -1;
  65. private length: number = 0;
  66. [Symbol.iterator]() { return this };
  67. next() {
  68. const index = ++this.index;
  69. if (index < this.length) this.value = this.xs[index];
  70. else this.done = true;
  71. return this;
  72. }
  73. reset(xs: any[]) {
  74. this.value = xs[0];
  75. this.length = xs.length;
  76. this.done = false;
  77. this.xs = xs;
  78. this.index = -1;
  79. return this;
  80. }
  81. }
  82. class _ImmutableES6Iterator implements ES6Iterator {
  83. done = true;
  84. value = 0;
  85. private xs: any[] = void 0 as any;
  86. private index: number = -1;
  87. private length: number = 0;
  88. [Symbol.iterator]() { return this };
  89. next() {
  90. const index = ++this.index;
  91. if (index < this.length) this.value = this.xs[index];
  92. else this.done = true;
  93. return { done: this.done, value: this.value };
  94. }
  95. reset(xs: any[]) {
  96. this.value = xs[0];
  97. this.length = xs.length;
  98. this.done = false;
  99. this.xs = xs;
  100. this.index = -1;
  101. return this;
  102. }
  103. }
  104. export function mutableES6Iterator() {
  105. const it = new _MutableES6Iterator();
  106. let sum = 0;
  107. for (let e = it.reset(data).next().value; !it.done; e = it.next().value) {
  108. sum += e;
  109. }
  110. return sum;
  111. }
  112. // export function mutableES6IteratorOf() {
  113. // const it = new _ImmutableES6Iterator();
  114. // let sum = 0;
  115. // for (const e of it.reset(data)) {
  116. // sum += e;
  117. // }
  118. // return sum;
  119. // }
  120. export function immutableES6Iterator() {
  121. const it = new _ImmutableES6Iterator();
  122. let sum = 0;
  123. it.reset(data);
  124. while (true) {
  125. const { value, done } = it.next();
  126. if (done) break;
  127. sum += value;
  128. }
  129. return sum;
  130. }
  131. // export function immutableES6IteratorOf() {
  132. // const it = new _MutableES6Iterator();
  133. // let sum = 0;
  134. // for (const e of it.reset(data)) {
  135. // sum += e;
  136. // }
  137. // return sum;
  138. // }
  139. interface MutableIterator {
  140. done: boolean;
  141. next(): number;
  142. start(data: any[]): number;
  143. }
  144. class _MutableIterator implements MutableIterator {
  145. done = true;
  146. private xs: any[] = void 0 as any;
  147. private index: number = -1;
  148. private length: number = 0;
  149. next() {
  150. const index = ++this.index;
  151. if (index < this.length) return this.xs[index];
  152. else {
  153. this.done = true;
  154. return 0;
  155. }
  156. }
  157. start(xs: any[]) {
  158. this.length = xs.length;
  159. this.done = !this.length;
  160. this.xs = xs;
  161. this.index = 0;
  162. return this.done ? 0 : this.xs[0];
  163. }
  164. }
  165. export function mutableIterator() {
  166. const it = new _MutableIterator();
  167. let sum = 0;
  168. for (let e = it.start(data); !it.done; e = it.next()) {
  169. sum += e;
  170. }
  171. return sum;
  172. }
  173. export function run() {
  174. const suite = new B.Suite();
  175. suite
  176. .add('for', () => Iterators.forLoop())
  177. .add('forOf', () => Iterators.forOf())
  178. .add('forEach', () => Iterators.forEach())
  179. .add('forEach all params', () => Iterators.forEachAllParams())
  180. .add('forEachClosure', () => Iterators.forEachClosure())
  181. .add('forEachClosure all', () => Iterators.forEachClosureAll())
  182. .add('forEachClosure all function', () => Iterators.forEachClosureAllFunction())
  183. .add('mutableIterator ES6', () => Iterators.mutableES6Iterator())
  184. //.add('mutableIteratorOf ES6', () => Iterators.mutableES6IteratorOf())
  185. .add('immutableIterator ES6', () => Iterators.immutableES6Iterator())
  186. //.add('immutableIteratorOf ES6', () => Iterators.immutableES6IteratorOf())
  187. .add('mutableIterator', () => Iterators.mutableIterator())
  188. .on('cycle', (e: any) => {
  189. console.log(String(e.target));
  190. })
  191. // .on('complete', function (this: any) {
  192. // console.log('Fastest is ' + this.filter('fastest').map('name'));
  193. // })
  194. .run();
  195. }
  196. }
  197. const it = It.Array([1, 2, 3]);
  198. while (it.hasNext) {
  199. console.log(it.move());
  200. }