tasks.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import * as B from 'benchmark'
  2. import { now } from 'mol-util/now';
  3. import { Scheduler } from 'mol-task/util/scheduler'
  4. export namespace Tasks {
  5. export class Yielding {
  6. lastUpdated = 0;
  7. yield(): Promise<void> | void {
  8. const t = now();
  9. if (t - this.lastUpdated < 250) return;
  10. this.lastUpdated = t;
  11. return Scheduler.immediatePromise();
  12. }
  13. }
  14. export class CheckYielding {
  15. lastUpdated = 0;
  16. get needsYield() {
  17. return now() - this.lastUpdated > 250;
  18. }
  19. yield(): Promise<void> {
  20. this.lastUpdated = now();
  21. return Scheduler.immediatePromise();
  22. }
  23. }
  24. export async function yielding() {
  25. console.time('yielding');
  26. const y = new Yielding();
  27. let ret = 0;
  28. for (let i = 0; i < 1000000; i++) {
  29. ret += +(i.toString() + i.toString());
  30. if (i % 10000 === 0) await y.yield();
  31. }
  32. console.timeEnd('yielding');
  33. console.log(ret);
  34. return ret;
  35. }
  36. export async function yielding1() {
  37. console.time('yielding1');
  38. const y = new Yielding();
  39. let ret = 0;
  40. let yy: any;
  41. for (let i = 0; i < 1000000; i++) {
  42. ret += +(i.toString() + i.toString());
  43. if (i % 10000 === 0 && (yy = y.yield())) await yy;
  44. }
  45. console.timeEnd('yielding1');
  46. console.log(ret);
  47. return ret;
  48. }
  49. export async function testYielding() {
  50. console.time('check yielding');
  51. const y = new CheckYielding();
  52. let ret = 0;
  53. for (let i = 0; i < 1000000; i++) {
  54. ret += +(i.toString() + i.toString());
  55. if (i % 10000 === 0 && y.needsYield) await y.yield();
  56. }
  57. console.timeEnd('check yielding');
  58. console.log(ret);
  59. return ret;
  60. }
  61. export async function baseline() {
  62. console.time('baseline');
  63. let ret = 0;
  64. for (let i = 0; i < 1000000; i++) {
  65. ret += +(i.toString() + i.toString());
  66. }
  67. console.timeEnd('baseline');
  68. console.log(ret);
  69. return ret;
  70. }
  71. export async function testImmediate() {
  72. console.time('immediate');
  73. let ret = 0;
  74. const y = new CheckYielding();
  75. for (let i = 0; i < 1000000; i++) {
  76. // ret += +(i.toString() + i.toString());
  77. if (i % 10000 === 0) await y.yield();
  78. }
  79. console.timeEnd('immediate');
  80. console.log(ret);
  81. return ret;
  82. }
  83. export function run() {
  84. const suite = new B.Suite();
  85. suite
  86. .add(`yielding`, async () => { return await yielding() })
  87. // .add(`test yielding`, () => testYielding().then(() => { }))
  88. .on('cycle', (e: any) => console.log(String(e.target)))
  89. .run();
  90. }
  91. function add(x: number, y: number) {
  92. return x + y;
  93. }
  94. // async function addAs(x: number, y: number) {
  95. // return x + y;
  96. // }
  97. async function opAsync(n: number) {
  98. let ret = 0;
  99. for (let i = 0; i < n; i++) {
  100. const v = add(i, i + 1);
  101. ret += (v as any).then ? await v : v;
  102. }
  103. return ret;
  104. }
  105. function opNormal(n: number) {
  106. let ret = 0;
  107. for (let i = 0; i < n; i++) {
  108. ret += add(i, i + 1);
  109. }
  110. return ret;
  111. }
  112. export async function awaitF() {
  113. const N = 10000000;
  114. console.time('async');
  115. console.log(await opAsync(N));
  116. console.timeEnd('async');
  117. console.time('async');
  118. console.log(await opAsync(N));
  119. console.timeEnd('async');
  120. console.time('async');
  121. console.log(await opAsync(N));
  122. console.timeEnd('async');
  123. console.time('normal');
  124. console.log(opNormal(N));
  125. console.timeEnd('normal');
  126. console.time('normal');
  127. console.log(opNormal(N));
  128. console.timeEnd('normal');
  129. console.time('normal');
  130. console.log(opNormal(N));
  131. console.timeEnd('normal');
  132. // const suite = new B.Suite();
  133. // suite
  134. // .add(`async`, async () => { return await opAsync(100000); })
  135. // .add(`normal`, () => { return opNormal(100000); })
  136. // .on('cycle', (e: any) => console.log(String(e.target)))
  137. // .run();
  138. }
  139. }
  140. (async function() {
  141. // await Tasks.testImmediate();
  142. // await Tasks.testImmediate();
  143. // await Tasks.baseline();
  144. // await Tasks.yielding();
  145. // await Tasks.yielding1();
  146. // await Tasks.testYielding();
  147. // await Tasks.baseline();
  148. // await Tasks.yielding();
  149. // await Tasks.yielding1();
  150. // await Tasks.testYielding();
  151. await Tasks.awaitF();
  152. }())
  153. // console.time('test')
  154. // Tasks.yielding();
  155. // console.timeEnd('test')
  156. // console.time('test')
  157. // Tasks.yielding();
  158. // console.timeEnd('test')
  159. // console.time('test')
  160. // Tasks.testYielding();
  161. // console.timeEnd('test')
  162. // console.time('test')
  163. // Tasks.testYielding();
  164. // console.timeEnd('test')