fork download
  1. Array.prototype.swap=function(a, b)
  2. {
  3. var tmp=this[a];
  4. this[a]=this[b];
  5. this[b]=tmp;
  6. }
  7.  
  8. function partition(array, begin, end, pivot)
  9. {
  10. var piv=array[pivot];
  11. array.swap(pivot, end-1);
  12. var store=begin;
  13. var ix;
  14. for(ix=begin; ix<end-1; ++ix) {
  15. if(array[ix]<=piv) {
  16. array.swap(store, ix);
  17. ++store;
  18. }
  19. }
  20. array.swap(end-1, store);
  21.  
  22. return store;
  23. }
  24.  
  25. function qsort(array, begin, end)
  26. {
  27. if(end-1>begin) {
  28. var pivot=begin+Math.floor(Math.random()*(end-begin));
  29.  
  30. pivot=partition(array, begin, end, pivot);
  31.  
  32. qsort(array, begin, pivot);
  33. qsort(array, pivot+1, end);
  34. }
  35. }
  36.  
  37. function quick_sort(array) {
  38. qsort(array, 0, array.length);
  39. }
  40.  
  41. function shuffle(array) {
  42. var len = array.length;
  43. var i = len;
  44. while (i--) {
  45. var p = parseInt(Math.random() * len);
  46. var t = array[i];
  47. array[i] = array[p];
  48. array[p] = t;
  49. }
  50. }
  51.  
  52. function Item(param1, param2, param3, value) {
  53. this.param1 = param1;
  54. this.param2 = param2;
  55. this.param3 = param3;
  56. this.value = value;
  57. this.key = [param1, param2, param3].toString();
  58. this.toString = function() {
  59. return this.key;
  60. }
  61. }
  62.  
  63. function populateTestData() {
  64. var res = [];
  65. var guid = ['6aa20b7a-da8a-466d-8f0e-92e49ca62759', 'e2cd3214-1097-46fc-931c-03d5becc3318', 'a9d71320-aeed-445f-9741-bf61d45a565a'];
  66. for (var p1 = 0; p1 < guid.length; p1++) {
  67. for (var p2 = 0; p2 < 17; p2++) {
  68. for (var p3 = 0; p3 < 9; p3++) {
  69. var item = new Item(guid[p1], 'parameter' + p2, p3, [p1, p2, p3].toString());
  70. res.push(item);
  71. }
  72. }
  73. }
  74. return res;
  75. }
  76.  
  77. function listToMap(lst) {
  78. var map = {};
  79. for (var i = 0; i < lst.length; i++) {
  80. var item = lst[i];
  81. if (item.value != null) {
  82. var key = [item.param1, item.param2, item.param3];
  83. map[key] = item.value;
  84. }
  85. }
  86. return map;
  87. }
  88.  
  89. function arrayTranspose_(data) {
  90. if (data.length == 0 || data[0].length == 0) {
  91. return null;
  92. }
  93.  
  94. var ret = [];
  95. var retLen = data[0].length;
  96. for (var i = 0; i < retLen; ++i) {
  97. ret.push([]);
  98. }
  99.  
  100. for (var i = 0; i < data.length; ++i) {
  101. for (var j = 0; j < retLen; ++j) {
  102. ret[j][i] = data[i][j];
  103. }
  104. }
  105.  
  106. return ret;
  107. }
  108.  
  109. function adjustData_(inData) {
  110. var colData = inData.slice();
  111. // var tz = Session.getTimeZone();
  112. for (var c = 0; c < colData.length; c++) {
  113. var column = colData[c];
  114. var colLen = column.length;
  115. if (colLen > 0 && column[0].length > 0 && column[0][0] instanceof Date) {
  116. for (var i = 0; i < colLen; i++) {
  117. var value = column[i][0];
  118. if (value instanceof Date) {
  119. // column[i][0] = Utilities.formatDate(value, tz, 'yyyy-MM-dd HH:mm');
  120. column[i][0] = value.getFullYear() + '-' + (value.getMonth() + 1) + '-' + value.getDate() + ' ' + value.getHours() + ':' + value.getMinutes();
  121. }
  122. }
  123. }
  124. }
  125. var res = [];
  126. var rowData = arrayTranspose_(colData);
  127. for (var i = 0; i < rowData.length; i++) {
  128. var row = rowData[i];
  129. var rowCorrect = [];
  130. for (var j = 0; j < row.length; j++) {
  131. var rr = row[j];
  132. var r = '';
  133. if (rr != undefined) {
  134. r = rr[0];
  135. }
  136. rowCorrect.push(r);
  137. }
  138. res.push(rowCorrect);
  139. }
  140. return res;
  141. }
  142.  
  143. function populateTestData01() {
  144. var count = 127;
  145. var now = new Date().valueOf();
  146. var lstDate = [];
  147. var lstValue01 = [];
  148. var lstValue02 = [];
  149. for (var i = 0; i < count; i++) {
  150. var dateValue = new Date(now + i * 60000);
  151. lstDate.push([dateValue]);
  152. lstValue01.push([Math.random()]);
  153. lstValue02.push([Math.random()]);
  154. }
  155. return [lstDate, lstValue01, lstValue02];
  156. }
  157.  
  158. function test() {
  159. var count = 11;
  160. var lstData = populateTestData();
  161. shuffle(lstData);
  162. var start = new Date();
  163. var lstPreventOptimize = [];
  164. for (var i = 0; i < count; i++) {
  165. var mapData = listToMap(lstData);
  166. lstPreventOptimize.push(mapData);
  167. }
  168. var timeLstToMap = new Date() - start;
  169. var lstCopy00 = lstData.slice();
  170. var start = new Date();
  171. quick_sort(lstCopy00);
  172. var timeQuickSort = new Date() - start;
  173. var lstCopy01 = lstData.slice();
  174. var start = new Date();
  175. lstCopy01.sort();
  176. var timeSort = new Date() - start;
  177. var lstData01 = populateTestData01();
  178. var start = new Date();
  179. for (var i = 0; i < count; i++) {
  180. var adjustedData = adjustData_(lstData01);
  181. lstPreventOptimize.push(adjustedData);
  182. }
  183. var timeAdjust = new Date() - start;
  184. return { timeLstToMap: timeLstToMap, timeQuickSort: timeQuickSort, timeSort : timeSort, timeAdjust: timeAdjust, dummy: lstPreventOptimize };
  185. }
  186.  
  187. function runTest() {
  188. var start = new Date();
  189. var res = test();
  190. var timeTotal = new Date() - start;
  191. var resStr = 'Complete Time: ' + timeTotal + 'ms, List To Map Time: ' + res.timeLstToMap + 'ms, Adjust Time: ' + res.timeAdjust + 'ms, QuickSort Time: ' + res.timeQuickSort + 'ms, Sort Time: ' + res.timeSort + 'ms';
  192. return resStr;
  193. }
  194.  
  195. print(runTest());
  196.  
Success #stdin #stdout 0.13s 6996KB
stdin
Standard input is empty
stdout
Complete Time: 104ms, List To Map Time: 40ms, Adjust Time: 36ms, QuickSort Time: 11ms, Sort Time: 5ms