История изменений
Исправление crutch_master, (текущая версия) :
let arr = [];
for (let i = 0; i < 4_000_000; i++) {
arr.push({i, val : +(Math.random() > 0.5), streak : 0});
}
let start = new Date().getTime();
let streak = 0, len = arr.length;
let stack = [];
for (let i = 0; i < len; i++) {
let rec = arr[i];
if (!rec.val) {
if (stack.length) {
stack.forEach(v=>v.streak = streak);
stack = [];
}
streak = 0;
} else {
++streak;
stack.push(rec);
}
}
let time = new Date().getTime() - start;
time //161 ms
> arr
[
{ i: 0, val: 1, streak: 1 },
{ i: 1, val: 0, streak: 0 },
{ i: 2, val: 1, streak: 2 },
{ i: 3, val: 1, streak: 2 },
{ i: 4, val: 0, streak: 0 },
{ i: 5, val: 0, streak: 0 },
{ i: 6, val: 0, streak: 0 },
{ i: 7, val: 0, streak: 0 },
{ i: 8, val: 0, streak: 0 },
{ i: 9, val: 1, streak: 1 },
{ i: 10, val: 0, streak: 0 },
{ i: 11, val: 0, streak: 0 },
{ i: 12, val: 0, streak: 0 },
{ i: 13, val: 0, streak: 0 },
{ i: 14, val: 0, streak: 0 },
{ i: 15, val: 0, streak: 0 },
{ i: 16, val: 0, streak: 0 },
{ i: 17, val: 1, streak: 2 },
{ i: 18, val: 1, streak: 2 },
{ i: 19, val: 0, streak: 0 },
{ i: 20, val: 0, streak: 0 },
{ i: 21, val: 0, streak: 0 },
{ i: 22, val: 0, streak: 0 },
{ i: 23, val: 0, streak: 0 },
{ i: 24, val: 1, streak: 1 },
{ i: 25, val: 0, streak: 0 },
{ i: 26, val: 1, streak: 2 },
{ i: 27, val: 1, streak: 2 },
{ i: 28, val: 0, streak: 0 },
{ i: 29, val: 1, streak: 5 },
{ i: 30, val: 1, streak: 5 },
{ i: 31, val: 1, streak: 5 },
{ i: 32, val: 1, streak: 5 },
{ i: 33, val: 1, streak: 5 }
...
cat /proc/cpuinfo | grep "model name"
model name : Intel(R) Core(TM) i3-6300 CPU @ 3.80GHz
На сортировку ушло секунд 5 после перемешивания массива рандомом, для более-менее отсортированного массива быстрее. То есть в худшем случае оно отработает в ~5 раз быстрее, чем в самом извёрнутом случае на sql. Если взять во внимание сопровождаемость sql портянок, то спорить тут особо не о чём.
Исправление crutch_master, :
let arr = [];
for (let i = 0; i < 4_000_000; i++) {
arr.push({i, val : +(Math.random() > 0.5), steak : 0});
}
let start = new Date().getTime();
let steak = 0, len = arr.length;
let stack = [];
for (let i = 0; i < len; i++) {
let rec = arr[i];
if (!rec.val) {
if (stack.length) {
stack.forEach(v=>v.steak = steak);
stack = [];
}
steak = 0;
} else {
++steak;
stack.push(rec);
}
}
let time = new Date().getTime() - start;
time //161 ms
> arr
[
{ i: 0, val: 1, steak: 1 },
{ i: 1, val: 0, steak: 0 },
{ i: 2, val: 1, steak: 2 },
{ i: 3, val: 1, steak: 2 },
{ i: 4, val: 0, steak: 0 },
{ i: 5, val: 0, steak: 0 },
{ i: 6, val: 0, steak: 0 },
{ i: 7, val: 0, steak: 0 },
{ i: 8, val: 0, steak: 0 },
{ i: 9, val: 1, steak: 1 },
{ i: 10, val: 0, steak: 0 },
{ i: 11, val: 0, steak: 0 },
{ i: 12, val: 0, steak: 0 },
{ i: 13, val: 0, steak: 0 },
{ i: 14, val: 0, steak: 0 },
{ i: 15, val: 0, steak: 0 },
{ i: 16, val: 0, steak: 0 },
{ i: 17, val: 1, steak: 2 },
{ i: 18, val: 1, steak: 2 },
{ i: 19, val: 0, steak: 0 },
{ i: 20, val: 0, steak: 0 },
{ i: 21, val: 0, steak: 0 },
{ i: 22, val: 0, steak: 0 },
{ i: 23, val: 0, steak: 0 },
{ i: 24, val: 1, steak: 1 },
{ i: 25, val: 0, steak: 0 },
{ i: 26, val: 1, steak: 2 },
{ i: 27, val: 1, steak: 2 },
{ i: 28, val: 0, steak: 0 },
{ i: 29, val: 1, steak: 5 },
{ i: 30, val: 1, steak: 5 },
{ i: 31, val: 1, steak: 5 },
{ i: 32, val: 1, steak: 5 },
{ i: 33, val: 1, steak: 5 }
...
cat /proc/cpuinfo | grep "model name"
model name : Intel(R) Core(TM) i3-6300 CPU @ 3.80GHz
На сортировку ушло секунд 5 после перемешивания массива рандомом, для более-менее отсортированного массива быстрее. То есть в худшем случае оно отработает в ~5 раз быстрее, чем в самом извёрнутом случае на sql. Если взять во внимание сопровождаемость sql портянок, то спорить тут особо не о чём.
Исходная версия crutch_master, :
var arr = [];
for (let i = 0; i < 4_000_000; i++) {
arr.push({i, val : +(Math.random() > 0.5), steak : 0});
}
var start = new Date().getTime();
var steak = 0, len = arr.length;
var stack = [];
for (let i = 0; i < len; i++) {
let rec = arr[i];
if (!rec.val) {
if (stack.length) {
stack.forEach(v=>v.steak = steak);
stack = [];
}
steak = 0;
} else {
++steak;
stack.push(rec);
}
}
var time = new Date().getTime() - start;
time //161 ms
> arr
[
{ i: 0, val: 1, steak: 1 },
{ i: 1, val: 0, steak: 0 },
{ i: 2, val: 1, steak: 2 },
{ i: 3, val: 1, steak: 2 },
{ i: 4, val: 0, steak: 0 },
{ i: 5, val: 0, steak: 0 },
{ i: 6, val: 0, steak: 0 },
{ i: 7, val: 0, steak: 0 },
{ i: 8, val: 0, steak: 0 },
{ i: 9, val: 1, steak: 1 },
{ i: 10, val: 0, steak: 0 },
{ i: 11, val: 0, steak: 0 },
{ i: 12, val: 0, steak: 0 },
{ i: 13, val: 0, steak: 0 },
{ i: 14, val: 0, steak: 0 },
{ i: 15, val: 0, steak: 0 },
{ i: 16, val: 0, steak: 0 },
{ i: 17, val: 1, steak: 2 },
{ i: 18, val: 1, steak: 2 },
{ i: 19, val: 0, steak: 0 },
{ i: 20, val: 0, steak: 0 },
{ i: 21, val: 0, steak: 0 },
{ i: 22, val: 0, steak: 0 },
{ i: 23, val: 0, steak: 0 },
{ i: 24, val: 1, steak: 1 },
{ i: 25, val: 0, steak: 0 },
{ i: 26, val: 1, steak: 2 },
{ i: 27, val: 1, steak: 2 },
{ i: 28, val: 0, steak: 0 },
{ i: 29, val: 1, steak: 5 },
{ i: 30, val: 1, steak: 5 },
{ i: 31, val: 1, steak: 5 },
{ i: 32, val: 1, steak: 5 },
{ i: 33, val: 1, steak: 5 }
...
cat /proc/cpuinfo | grep "model name"
model name : Intel(R) Core(TM) i3-6300 CPU @ 3.80GHz
На сортировку ушло секунд 5 после перемешивания массива рандомом, для более-менее отсортированного массива быстрее. То есть в худшем случае оно отработает в ~5 раз быстрее, чем в самом извёрнутом случае на sql. Если взять во внимание сопровождаемость sql портянок, то спорить тут особо не о чём.