智慧水务管理系统 - 精河县供水工程综合管理平台

benchmark.js 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import { MeshoptEncoder as encoder } from './meshopt_encoder.js';
  2. import { MeshoptDecoder as decoder } from './meshopt_decoder.mjs';
  3. import { performance } from 'perf_hooks';
  4. process.on('unhandledRejection', (error) => {
  5. console.log('unhandledRejection', error);
  6. process.exit(1);
  7. });
  8. function bytes(view) {
  9. return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
  10. }
  11. var tests = {
  12. roundtripVertexBuffer: function () {
  13. var N = 1024 * 1024;
  14. var data = new Uint8Array(N * 16);
  15. var lcg = 1;
  16. for (var i = 0; i < N * 16; ++i) {
  17. // mindstd_rand
  18. lcg = (lcg * 48271) % 2147483647;
  19. var k = i % 16;
  20. if (k <= 8) data[i] = lcg & ((1 << k) - 1);
  21. else data[i] = i & ((1 << (k - 8)) - 1);
  22. }
  23. var decoded = new Uint8Array(N * 16);
  24. var t0 = performance.now();
  25. var encoded = encoder.encodeVertexBuffer(data, N, 16);
  26. var t1 = performance.now();
  27. decoder.decodeVertexBuffer(decoded, N, 16, encoded);
  28. var t2 = performance.now();
  29. return { encodeVertex: t1 - t0, decodeVertex: t2 - t1, bytes: N * 16 };
  30. },
  31. roundtripIndexBuffer: function () {
  32. var N = 1024 * 1024;
  33. var data = new Uint32Array(N * 3);
  34. for (var i = 0; i < N * 3; i += 6) {
  35. var v = i / 6;
  36. data[i + 0] = v;
  37. data[i + 1] = v + 1;
  38. data[i + 2] = v + 2;
  39. data[i + 3] = v + 2;
  40. data[i + 4] = v + 1;
  41. data[i + 5] = v + 3;
  42. }
  43. var decoded = new Uint32Array(data.length);
  44. var t0 = performance.now();
  45. var encoded = encoder.encodeIndexBuffer(bytes(data), data.length, 4);
  46. var t1 = performance.now();
  47. decoder.decodeIndexBuffer(bytes(decoded), data.length, 4, encoded);
  48. var t2 = performance.now();
  49. return { encodeIndex: t1 - t0, decodeIndex: t2 - t1, bytes: N * 12 };
  50. },
  51. decodeGltf: function () {
  52. var N = 1024 * 1024;
  53. var data = new Uint8Array(N * 16);
  54. for (var i = 0; i < N * 16; i += 4) {
  55. data[i + 0] = 0;
  56. data[i + 1] = (i % 16) * 1;
  57. data[i + 2] = (i % 16) * 2;
  58. data[i + 3] = (i % 16) * 8;
  59. }
  60. var decoded = new Uint8Array(N * 16);
  61. var filters = [
  62. { name: 'none', filter: 'NONE', stride: 16 },
  63. { name: 'oct8', filter: 'OCTAHEDRAL', stride: 4 },
  64. { name: 'oct12', filter: 'OCTAHEDRAL', stride: 8 },
  65. { name: 'quat12', filter: 'QUATERNION', stride: 8 },
  66. { name: 'col8', filter: 'COLOR', stride: 4 },
  67. { name: 'col12', filter: 'COLOR', stride: 8 },
  68. { name: 'exp', filter: 'EXPONENTIAL', stride: 16 },
  69. ];
  70. var results = { bytes: N * 16 };
  71. for (var i = 0; i < filters.length; ++i) {
  72. var f = filters[i];
  73. var encoded = encoder.encodeVertexBuffer(data, (N * 16) / f.stride, f.stride);
  74. var t0 = performance.now();
  75. decoder.decodeGltfBuffer(decoded, (N * 16) / f.stride, f.stride, encoded, 'ATTRIBUTES', f.filter);
  76. var t1 = performance.now();
  77. results[f.name] = t1 - t0;
  78. }
  79. return results;
  80. },
  81. };
  82. Promise.all([encoder.ready, decoder.ready]).then(() => {
  83. var reps = 10;
  84. var data = {};
  85. for (var key in tests) {
  86. data[key] = tests[key]();
  87. }
  88. for (var i = 1; i < reps; ++i) {
  89. for (var key in tests) {
  90. var nd = tests[key]();
  91. var od = data[key];
  92. for (var idx in nd) {
  93. od[idx] = Math.min(od[idx], nd[idx]);
  94. }
  95. }
  96. }
  97. for (var key in tests) {
  98. var rep = key;
  99. rep += ':\n';
  100. for (var idx in data[key]) {
  101. if (idx != 'bytes') {
  102. rep += idx;
  103. rep += ' ';
  104. rep += data[key][idx].toFixed(3);
  105. rep += ' ms (';
  106. rep += ((data[key].bytes / 1e9 / data[key][idx]) * 1000).toFixed(3);
  107. rep += ' GB/s)';
  108. if (key == 'decodeGltf' && idx != 'none') {
  109. rep += '; filter ';
  110. rep += ((data[key].bytes / 1e9 / (data[key][idx] - data[key]['none'])) * 1000).toFixed(3);
  111. rep += ' GB/s';
  112. }
  113. rep += '\n';
  114. }
  115. }
  116. console.log(rep);
  117. }
  118. });