Информация об изменениях

Сообщение Re[7]: Реальная производительность WebAssembly? от 17.09.2017 18:35

Изменено 17.09.2017 18:36 Pauel

Re[7]: Реальная производительность WebAssembly?
Здравствуйте, CoderMonkey, Вы писали:

CM>А давай ка посмотрим на более близкий к реальности код?

CM>Как это будет на JS?

CM>

// нерабочий говнокод скипнут

CM>


К слову о реальности. В твоей, похоже, твой квиксорт вполне работает. гы-гы.

Вот порт 1-к-1 твоего кода с сохранением структуры и прочих вещей, кроме нескольких мелочей + необходимый фиксы

у меня время выполнения 8-10сек. Считать нужно не так, как у тебя, а по отдельности инициализацию и сортировку, потому как рантаймы отличаются очень сильно и при всем желании получить аналог твоих приседаний с гуидами не выйдет, тк в js отсутствует guid.

'use strict';

const N = 1000*1000;
const re = /-/g;

function Main(number) {
    const watch = Date.now();
    const vals = ToArray(Select(Range(0, number), x => new TestClass()));
    const compare = (x, y) =>{
        if(x === y)
            return 0;
        if(x > y)
            return 1;
        return -1;
    };
    console.warn(`Init, miliseconds: ${Date.now() - watch}`);
    watch = Date.now();
    QuickSort(vals, (x,y)=>compare(x.Id, y.Id));
    console.warn(`Total miliseconds: ${Date.now() - watch}`);
}

function QuickSort(vals, compare){
    QuickSortImpl(vals, compare, 0, vals.length - 1);
}

function QuickSortImpl (vals, compare, left, right) {
    if (right <= left)
        return;

    let i = left;
    let j = right;
    const mid = Math.floor((left + right) / 2);
    const midVal = vals[mid];

    while (i <= j) {
        while (compare(vals[i], midVal) > 0) {
            i++;
        }

        while (compare(vals[j], midVal) < 0) {
            j--;
        }

        if (i <= j) {
            const tmp = vals[i];
            vals[i] = vals[j];
            vals[j] = tmp;

            i++;
            j--;
        }
    }

    if(left < i - 1) {
        QuickSortImpl(vals, compare, left, i - 1);
    }

    if(right > i) {
        QuickSortImpl(vals, compare, i, right);
    }
}

class TestClass {
    constructor() {
        this.Id = CreateGuid();
        this.Value = CreateGuid();
    }

    toString() {
        return this.Id;
    }
}

function ToArray(iterator) {
    return [...iterator];
}

function* Range(start, end) {
    for(let i = start; i<end; i++) {
        yield i;
    }
}

function* Select(iterator, projector) {
    for(let x of iterator) {
        yield projector(x);
    }
}

function CreateGuid() {
    return NewGuid().toString().replace(re, "");
}

function NewGuid() {
    function s4() {
        return Math.floor((1 + Math.random()) * 0x10000)
            .toString(16)
            .substring(1);
    }
    return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
        s4() + '-' + s4() + s4() + s4();
}

function delay(time) {
    return new Promise((resolve)=>{
        setTimeout(resolve, time);
    });
}

for(let i = 0, promise = Promise.resolve(); i<100;i++) {
    promise = promise.then(()=>Main(N)).then(()=>delay(1000));
}
Re[7]: Реальная производительность WebAssembly?
Здравствуйте, CoderMonkey, Вы писали:

CM>А давай ка посмотрим на более близкий к реальности код?

CM>Как это будет на JS?

CM>

// нерабочий говнокод скипнут

CM>


К слову о реальности. В твоей, похоже, твой квиксорт вполне работает. гы-гы.

Вот порт 1-к-1 твоего кода с сохранением структуры и прочих вещей, кроме нескольких мелочей + необходимый фиксы

Считать нужно не так, как у тебя, а по отдельности инициализацию и сортировку, потому как рантаймы отличаются очень сильно и при всем желании получить аналог твоих приседаний с гуидами не выйдет, тк в js отсутствует guid.

'use strict';

const N = 1000*1000;
const re = /-/g;

function Main(number) {
    const watch = Date.now();
    const vals = ToArray(Select(Range(0, number), x => new TestClass()));
    const compare = (x, y) =>{
        if(x === y)
            return 0;
        if(x > y)
            return 1;
        return -1;
    };
    console.warn(`Init, miliseconds: ${Date.now() - watch}`);
    watch = Date.now();
    QuickSort(vals, (x,y)=>compare(x.Id, y.Id));
    console.warn(`Total miliseconds: ${Date.now() - watch}`);
}

function QuickSort(vals, compare){
    QuickSortImpl(vals, compare, 0, vals.length - 1);
}

function QuickSortImpl (vals, compare, left, right) {
    if (right <= left)
        return;

    let i = left;
    let j = right;
    const mid = Math.floor((left + right) / 2);
    const midVal = vals[mid];

    while (i <= j) {
        while (compare(vals[i], midVal) > 0) {
            i++;
        }

        while (compare(vals[j], midVal) < 0) {
            j--;
        }

        if (i <= j) {
            const tmp = vals[i];
            vals[i] = vals[j];
            vals[j] = tmp;

            i++;
            j--;
        }
    }

    if(left < i - 1) {
        QuickSortImpl(vals, compare, left, i - 1);
    }

    if(right > i) {
        QuickSortImpl(vals, compare, i, right);
    }
}

class TestClass {
    constructor() {
        this.Id = CreateGuid();
        this.Value = CreateGuid();
    }

    toString() {
        return this.Id;
    }
}

function ToArray(iterator) {
    return [...iterator];
}

function* Range(start, end) {
    for(let i = start; i<end; i++) {
        yield i;
    }
}

function* Select(iterator, projector) {
    for(let x of iterator) {
        yield projector(x);
    }
}

function CreateGuid() {
    return NewGuid().toString().replace(re, "");
}

function NewGuid() {
    function s4() {
        return Math.floor((1 + Math.random()) * 0x10000)
            .toString(16)
            .substring(1);
    }
    return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
        s4() + '-' + s4() + s4() + s4();
}

function delay(time) {
    return new Promise((resolve)=>{
        setTimeout(resolve, time);
    });
}

for(let i = 0, promise = Promise.resolve(); i<100;i++) {
    promise = promise.then(()=>Main(N)).then(()=>delay(1000));
}