LINUX.ORG.RU

История изменений

Исправление 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 портянок, то спорить тут особо не о чём.