Skip to content

Sorting an ArrayOfBufferBackedObjects doesn't actually work? #18

Open
@ibsusu

Description

Should I create my own sort function in order to make this work? The built in ArrayOfBufferBackedObjects sort doesn't actually sort the buffer.

// worker.js
importScripts(
  "comlink.js",
  "buffer-backed-object.modern.js" // this had to be modified becasue of the exports to properly name AOBBO, BBO, and structSize
); 

function testSort(buf, key){
  console.log("sort buf", buf);
  const descriptors = {
    name: BufferBackedObject.UTF8String(90),
    otherKey: BufferBackedObject.UTF8String(10)
  };

  const boar = new ArrayOfBufferBackedObjects(buf, descriptors);
  console.log("worker sort boar", boar[0].name, boar[1].name);
  function compare(itemA, itemB){
      if (itemA[key] < itemB[key]){
        return -1;
      }
      if (itemA[key] > itemB[key]){
        return 1;
      }
      return 0;
  }

  let u8 = new Uint8Array(boar.buffer);
  console.log("worker buffer u8 before sort", u8.slice(100));

  boar.sort(compare);
  console.log("worker boar 0 and 1", boar[0].name, boar[1].name);

  console.log("worker buffer u8 after sort", u8.slice(100));

  // return buf;//Comlink.transfer(buf, [buf]);
  return Comlink.transfer(boar.buffer, [boar.buffer]);
}
//ui.js

let namePromises = [];
for (let i=0;i<1000;++i){
    namePromises.push(utils.getRandomName());
}

let names = await Promise.all(namePromises);
let items = [];
console.log("creating items");
let start = window.performance.now();
for(let i=0;i<names.length;++i){
    items.push({otherKey: "yay", name: names[i]});
}

console.log(`finished creating items in ${(window.performance.now() - start)/1000} seconds`);

let bbos = [];
console.log("creating bbos");
start = window.performance.now();
let descriptors = {
    name: BufferBackedObject.UTF8String(90),
    otherKey: BufferBackedObject.UTF8String(10)
};

const descriptorSize = window.structSize(descriptors);
const buf = new ArrayBuffer(descriptorSize*names.length);
const boar = new ArrayOfBufferBackedObjects(buf, descriptors);

const buf2 = new ArrayBuffer(descriptorSize*names.length);
let boar2 = new ArrayOfBufferBackedObjects(buf2, descriptors);

for(let i=0;i<names.length;++i){
    // sorted on this thread
    const bbo = boar[i];
    bbo.name = names[i];
    bbo.otherKey = "yay";

    // sorted on the worker
    const bbo2 = boar2[i];
    bbo2.name = names[i];
    bbo2.otherKey = "yay";
}

console.log(`finished creating bbos in ${(window.performance.now() - start)/1000} seconds`);

function compare(itemA, itemB){
    if (itemA.name < itemB.name){
      return -1;
    }
    if (itemA.name > itemB.name){
      return 1;
    }
    return 0;
}

// sorted just fine.
console.log("starting the item sort");
start = window.performance.now();
let sorted = items.sort(compare);
console.log(`finished sorting in ${(window.performance.now() - start)/1000} seconds`);

// It's sorted but the buffer remains the same
console.log("starting the bbo sort");
start = window.performance.now();
let sorted2 = boar.sort(compare);
console.log(`finished sorting in ${(window.performance.now() - start)/1000} seconds`);

let worker = new Worker("worker.js");
let bboWorker = Comlink.wrap(worker);

// this is never sorted because the buffer isn't changed on the worker thread.
console.log("starting the bbo2 sort");
start = window.performance.now();
let boar2Check = await bboWorker.testSort(Comlink.transfer(boar2.buffer, [boar2.buffer]), "name");
console.log(`finished sorting in ${(window.performance.now() - start)/1000} seconds`);

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions