JavaScriptProgramación

Descubra cómo usar SharedArrayBuffer en JavaScript

Aprende a aprovechar la funcionalidad de SharedArrayBuffer para mejorar el rendimiento y la comunicación entre hilos en tus proyectos de JavaScript.

La función SharedArrayBuffer es una herramienta poderosa en JavaScript que permite a los desarrolladores compartir memoria entre diferentes hilos o procesos. Esta capacidad es especialmente útil para mejorar el rendimiento y la comunicación en aplicaciones de alto volumen de datos o con múltiples hilos.

Ejemplo 1: Suma de elementos en un array utilizando SharedArrayBuffer()


const sharedArray = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 10);
const int32Array = new Int32Array(sharedArray);

// Llenar el array con valores aleatorios
for (let i = 0; i < 10; i++) {
  int32Array[i] = Math.floor(Math.random() * 100);
}

// Suma de elementos en paralelo utilizando SharedArrayBuffer()
const suma = new Promise((resolve) => {
  const worker = new Worker('worker.js', {
    args: [sharedArray],
  });

  worker.postMessage({
    type: 'sumar',
    data: int32Array,
  });

  worker.onmessage = (event) => {
    resolve(event.data);
    worker.terminate();
  };
});

// Mostrar el resultado de la suma
console.log('La suma es:', await suma);

Ejemplo 2: Transferencia de datos entre trabajadores utilizando SharedArrayBuffer()


// Worker.js
self.importScripts('postMessage.worker');

const sharedArray = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 10);
const int32Array = new Int32Array(sharedArray);

const sourceData = postMessage.getData();
for (let i = 0; i < sourceData.length; i++) {
  int32Array[i] = sourceData[i];
}

postMessage({
  type: 'transferido',
  data: int32Array,
});

// main.js
const sharedArray = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 10);
const int32Array = new Int32Array(sharedArray);

// Llenar el array con valores aleatorios
for (let i = 0; i < 10; i++) {
  int32Array[i] = Math.floor(Math.random() * 100);
}

const worker = new Worker('worker.js', {
  args: [sharedArray],
});

worker.postMessage({
  type: 'transferir',
  data: int32Array,
});

worker.onmessage = (event) => {
  console.log('Datos transferidos con éxito:', event.data);
  worker.terminate();
};

Ejemplo 3: Comunicación entre trabajadores utilizando SharedArrayBuffer()


// Worker1.js
self.importScripts('postMessage.worker');

const sharedArray = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 10);
const int32Array = new Int32Array(sharedArray);

const sourceData = postMessage.getData();
for (let i = 0; i < sourceData.length; i++) {
  int32Array[i] = sourceData[i];
}

postMessage({
  type: 'datos',
  data: int32Array,
});

// Worker2.js
self.importScripts('postMessage.worker');

const sharedArray = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 10);
const int32Array = new Int32Array(sharedArray);

const sourceData = postMessage.getData();
for (let i = 0; i < sourceData.length; i++) {
  int32Array[i] = sourceData[i];
}

postMessage({
  type: 'datos',
  data: int32Array,
});

// main.js
const sharedArray = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 10);
const worker1 = new Worker('worker1.js', {
  args: [sharedArray],
});

const worker2 = new Worker('worker2.js', {
  args: [sharedArray],
});

worker1.onmessage = (event) => {
  console.log('Datos de Worker1:', event.data);
};

worker2.onmessage = (event) => {
  console.log('Datos de Worker2:', event.data);
};

Ejemplo 4: Algoritmo de ordenación de burbuja utilizando SharedArrayBuffer()


const sharedArray = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * array.length);
const int32Array = new Int32Array(sharedArray);

// Copiar el array original en el SharedArrayBuffer
for (let i = 0; i < array.length; i++) {
  int32Array[i] = array[i];
}

const ordenarBurbujas = new Promise((resolve) => {
  const worker = new Worker('ordenacionBurbuja.js', {
    args: [sharedArray],
  });

  worker.postMessage({
    type: 'iniciarOrdenamiento',
    data: int32Array,
  });

  worker.onmessage = (event) => {
    resolve(event.data);
    worker.terminate();
  };
});

ordenarBurbujas.then((resultado) => {
  console.log('Array ordenado:', resultado);
});

// ordenacionBurbuja.js
self.importScripts('postMessage.worker');

const sharedArray = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * args[0]);
const int32Array = new Int32Array(sharedArray);

// Copiar el array original en el SharedArrayBuffer
for (let i = 0; i < args[0].length; i++) {
  int32Array[i] = args[0][i];
}

const tamanioArray = int32Array.length;

for (let i = 0; i < tamanioArray - 1; i++) {
  for (let j = 0; j < tamanioArray - i - 1; j++) {
    if (int32Array[j] > int32Array[j + 1]) {
      const temp = int32Array[j];
      int32Array[j] = int32Array[j + 1];
      int32Array[j + 1] = temp;
    }
  }
}

postMessage({
  type: 'ordenamientoFinalizado',
  data: int32Array,
});

Ejemplo 5: Calculadora de pi utilizando SharedArrayBuffer()


const sharedArray = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 10);
const int32Array = new Int32Array(sharedArray);

// Llenar el array con valores aleatorios
for (let i = 0; i < 10; i++) {
  int32Array[i] = Math.floor(Math.random() * 100);
}

const calcularPi = new Promise((resolve) => {
  const worker = new Worker('calculadoraPi.js', {
    args: [sharedArray],
  });

  worker.postMessage({
    type: 'iniciarCalculo',
    data: int32Array,
  });

  worker.onmessage = (event) => {
    resolve(event.data);
    worker.terminate();
  };
});

calcularPi.then((resultado) => {
  console.log('Pi calculado:', resultado);
});

// calculadoraPi.js
self.importScripts('postMessage.worker');

const sharedArray = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * args[0]);
const int32Array = new Int32Array(sharedArray);

// Copiar el array original en el SharedArrayBuffer
for (let i = 0; i < args[0].length; i++) {
  int32Array[i] = args[0][i];
}

const PI_CONSTANTE = Math.PI;
const TOTAL_ITERACIONES = 1000000;
let iteracionesRealizadas = 0;
let acumulador = 0;

while (iteracionesRealizadas < TOTAL_ITERACIONES) {
  const x = Math.random() * 2 - 1;
  const y = Math.random() * 2 - 1;
  const distanciaCuadrada = x * x + y * y;

  if (distanciaCuadrada < 1) {
    acumulador += 4;
  }

  iteracionesRealizadas++;
}

const pi = (acumulador / TOTAL_ITERACIONES) * 0.25;

postMessage({
  type: 'calculoFinalizado',
  data: pi,
});

Conclusión

Utilizar SharedArrayBuffer en tus proyectos puede mejorar significativamente el rendimiento y la eficiencia de la memoria. Asegúrate de entender su funcionamiento correctamente y aplicarlo de manera adecuada en situaciones donde sea necesario. Con la ayuda de esta herramienta, podrás crear aplicaciones más escalables y resistentes a problemas de rendimiento.

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.