tasks.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import * as B from 'benchmark'
  2. import now from 'mol-task/util/now'
  3. import Immedite from 'mol-task/util/immediate'
  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 Immedite.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 Immedite.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. }
  92. (async function() {
  93. // await Tasks.testImmediate();
  94. // await Tasks.testImmediate();
  95. await Tasks.baseline();
  96. await Tasks.yielding();
  97. await Tasks.yielding1();
  98. await Tasks.testYielding();
  99. await Tasks.baseline();
  100. await Tasks.yielding();
  101. await Tasks.yielding1();
  102. await Tasks.testYielding();
  103. }())
  104. // console.time('test')
  105. // Tasks.yielding();
  106. // console.timeEnd('test')
  107. // console.time('test')
  108. // Tasks.yielding();
  109. // console.timeEnd('test')
  110. // console.time('test')
  111. // Tasks.testYielding();
  112. // console.timeEnd('test')
  113. // console.time('test')
  114. // Tasks.testYielding();
  115. // console.timeEnd('test')