Open
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
Labels
No labels