Optimización JS para optimización del rendimiento front-end

introducción

En el mundo tecnológico actual, ya sea una página web o una aplicación, el desarrollo front-end es sin duda crucial. Con el desarrollo de Internet, los usuarios tienen requisitos cada vez mayores en cuanto al rendimiento y la velocidad de carga de las páginas web. Como desarrolladores de aplicaciones para el usuario, debemos esforzarnos por lograr una mejor optimización del rendimiento. Entre ellos, JavaScript es el lenguaje central del desarrollo front-end y no se puede ignorar su impacto en el rendimiento de la página web. Este artículo se centrará en la optimización del rendimiento de JavaScript, a través de una serie de técnicas y métodos, para ayudar a los lectores a comprender cómo optimizar el código JavaScript, a fin de mejorar la velocidad de carga y la experiencia del usuario de las páginas web. Si usted es un desarrollador front-end que recién comienza o un veterano que ya tiene experiencia en la industria, puede aprender algunas habilidades prácticas de este artículo. Espero que este artículo pueda brindarle ayuda e inspiración. Profundicemos en el misterio de la optimización de JavaScript para la optimización del rendimiento del front-end.

1. El navegador carga el proceso del archivo js.

El proceso del navegador para cargar recursos de archivos js se puede dividir en las siguientes etapas:

  1. Iniciar una solicitud : el navegador obtiene el recurso del archivo js del servidor enviando una solicitud HTTP. Este proceso implica la transmisión de la red y el retraso de la red puede suponer una sobrecarga relativamente grande.

  2. Recibir respuesta : después de recibir la solicitud, el servidor devuelve un mensaje de respuesta que contiene el contenido del archivo js. El navegador analizará el encabezado de respuesta y recibirá el cuerpo de la respuesta. El tiempo necesario para este proceso depende del tamaño del archivo js y de la velocidad de transmisión de la red.

  3. Análisis de HTML : cuando el navegador recibe el archivo js, ​​si hay una referencia al archivo en la página HTML, el navegador pausará el análisis del HTML y descargará y analizará el archivo js lo antes posible. En este momento, el navegador ejecutará el motor js para analizar y compilar el archivo js. El tiempo que lleva este proceso depende del tamaño y la complejidad del archivo js.

  4. Ejecutar código js : cuando el archivo js se analiza y compila, el navegador ejecutará el código js que contiene. La velocidad de ejecución del código js depende del rendimiento del motor js y de la complejidad del código. Puede haber cierta sobrecarga de CPU al ejecutar código js.

  5. Actualizar la página : si el código js manipula la estructura DOM de la página, el navegador volverá a representar la página para reflejar la actualización del DOM. El tiempo necesario para una operación DOM depende de la complejidad de la operación y del rendimiento del navegador.

En términos generales, el proceso de carga de archivos js generalmente involucra múltiples etapas, como transmisión de red, análisis y compilación, ejecución y actualización de páginas , y la sobrecarga de cada etapa se verá afectada por diferentes factores, incluido el tamaño del archivo, la velocidad de la red y la complejidad del código. .

2. Comparación de la carga de js e imágenes del navegador

Cuando el navegador carga recursos JS y recursos de imagen del mismo tamaño, normalmente lleva más tiempo cargar los recursos JS .

Esto se debe a que existen varias etapas en el proceso de carga de recursos JS:

  1. Resolución DNS : el navegador obtiene la dirección IP del servidor a través de la resolución de nombres de dominio y completa el posicionamiento de los recursos.
  2. Establecer conexión : el navegador establece una conexión TCP con el servidor, incluido el proceso de protocolo de enlace de tres vías.
  3. Enviar solicitud : el navegador envía una solicitud GET al servidor para solicitar recursos relacionados.
  4. Recibir respuesta : el servidor devuelve una respuesta; dependiendo de la velocidad del servidor y las condiciones de la red, puede tardar un poco.
  5. Descargar recurso : una vez recibida la respuesta, el navegador comienza a descargar el recurso JS.
  6. Análisis y ejecución : una vez completada la descarga, el navegador comienza a analizar y ejecutar el código JS.

En cuanto al proceso de carga de recursos de imágenes, es relativamente sencillo e incluye principalmente las siguientes etapas:

  1. Resolución DNS .
  2. Establecer una conexión .
  3. Enviar solicitud .
  4. Recibe la respuesta .
  5. Descargar recursos .

Se puede ver que la carga de recursos JS aún debe analizarse y ejecutarse una vez completada la descarga, mientras que los recursos de imagen no necesitan analizarse ni ejecutarse, por lo que, en términos relativos, la carga de recursos JS consumirá mucho tiempo. más tiempo .

Según el entorno de red específico y la velocidad de respuesta del servidor, la siguiente tabla es una tabla comparativa que puede consumir mucho tiempo para diferentes etapas de carga:

escenario Los recursos JS consumen mucho tiempo. Los recursos de imagen consumen mucho tiempo
resolución DNS 20 ms 20 ms
establecer conexión 30 ms 30 ms
Enviar petición 10 ms 10 ms
recibir respuesta 50 ms 50 ms
descargar recursos 100 ms 100 ms
analizar y ejecutar 200 ms -
tiempo total invertido 410ms 210ms

Cabe señalar que los datos anteriores son solo de referencia y que el consumo de tiempo real se verá afectado por factores como las condiciones de la red, la velocidad de respuesta del servidor y el mecanismo de almacenamiento en caché.

3. La proporción de recursos js cargados por el navegador y el tiempo total de carga de recursos

En general, el tiempo necesario para que el navegador cargue los recursos JS ocupa una gran parte del tiempo necesario para cargar todos los recursos. Esto se debe a que JavaScript es un lenguaje de secuencias de comandos que debe ejecutarse en el lado del cliente y afectará directamente la interacción y la realización de funciones de la página, por lo que llevará mucho tiempo cargar y ejecutar recursos JS. Generalmente entre 10% y 30%

Por ejemplo, supongamos que un sitio web real consta de una página HTML, una hoja de estilos CSS y un archivo JS. Durante la carga, el navegador procede en el siguiente orden:

  1. Primero, el navegador descarga la página HTML. Este proceso es más rápido porque hay menos contenido HTML.

  2. A continuación, el navegador analiza la página HTML y encuentra referencias a hojas de estilo CSS durante el proceso de análisis. El navegador comenzará a descargar el archivo de hoja de estilo CSS y lo aplicará a la página una vez completada la descarga. Este proceso es más rápido que los recursos JS.

  3. Una vez cargado el estilo CSS, el navegador continuará analizando la página HTML y encontrará la referencia del archivo JS. En este punto, el navegador comenzará a descargar el archivo JS y ejecutará la lógica del script JS una vez completada la descarga. Dado que los archivos JS suelen contener procesamiento lógico complejo, así como posibles operaciones asincrónicas y solicitudes de red, el tiempo de carga y ejecución de JS puede ser mayor.

En resumen, para un sitio web, el tiempo requerido por el navegador para cargar recursos JS representa una gran parte del tiempo requerido para cargar todos los recursos. Debido a que el script JS juega un papel vital en la página, involucrando partes clave como la interacción y la realización de funciones, lleva mucho tiempo cargarlo y ejecutarlo. En algunos sitios web complejos, los recursos JS pueden incluso tardar más en cargarse que otros recursos.

Cabe señalar que la situación específica de la página también afectará la proporción de asignación de tiempo para la carga de cada recurso. Por ejemplo, si el contenido principal de un sitio web son imágenes, el tiempo de carga de los recursos de imágenes puede ser mayor, mientras que el tiempo de carga de los recursos JS es relativamente corto. Por lo tanto, esta proporción variará de un sitio a otro.

4. Descripción general del principio de compilación de v8

V8 es un JavaScriptmotor de código abierto, Googledesarrollado por V8, para ejecutar JavaScriptcódigo. Su principio de compilación se basa en la tecnología de compilación justo a tiempo ( Just-In-Time Compilation,JIT).

El proceso de compilación de V8 se puede dividir en tres etapas: análisis ( parsing), optimización ( optimization) y generación de código ( code generation).

  1. Fase de análisis :
    en la fase de análisis, V8 analiza JavaScriptel código en una estructura de datos llamada árbol de sintaxis abstracta ( Abstract Syntax Tree, AST). ASTEs una forma de representar código en una estructura de árbol , y cada nodo representa un componente del código, como variables, funciones, expresiones, etc. La fase de análisis también genera lexical scopeinformación sobre el alcance léxico () para las fases de optimización posteriores.

  2. Fase de optimización :
    la fase de optimización es la parte central del motor V8 . V8 utiliza una Just-In-Time Compilation,JITtécnica llamada compilación justo a tiempo (), que optimiza el código antes de ejecutarlo. V8 analiza las características de ejecución del código, intentando identificar e inferir el tipo y comportamiento del código. Con base en esta información, V8 realizará una serie de optimizaciones en el código, como funciones en línea ( inlining), eliminar códigos inútiles ( dead code elimination), generar códigos nativos ( native code generation), etc. Estas optimizaciones pueden mejorar significativamente JavaScriptla eficiencia de ejecución del código.

  3. Fase de generación de código :
    en la fase de generación de código, V8 convierte el código optimizado en código de máquina para su ejecución en el sistema subyacente. V8 adopta una Code Cachingtecnología llamada ejecución de caché (), que almacena en caché el código compilado y puede usarse directamente en ejecuciones posteriores para evitar compilaciones repetidas y mejorar el rendimiento.

Cabe señalar que la optimización de V8 se basa en la compilación justo a tiempo, lo que significa que V8 optimiza dinámicamente durante la ejecución del código, en lugar de realizar una optimización previa en la etapa estática. Al recopilar las características de ejecución del código en tiempo de ejecución, V8 se puede optimizar para escenarios de ejecución específicos, proporcionando así una mayor velocidad de ejecución y un menor uso de memoria.

En resumen, el principio de compilación de V8 es JavaScriptconvertir el código en un árbol de sintaxis abstracta, luego optimizarlo y finalmente generar código de máquina. Este diseño puede aprovechar al máximo las ventajas de la plataforma de hardware y proporcionar un JavaScriptentorno de ejecución de alto rendimiento.

5. Optimización a nivel de código para mejorar la eficiencia de compilación de V8

1. Optimización de funciones

Para mejorar la eficiencia de compilación de V8, se puede optimizar desde los siguientes aspectos:

1. Reducir el tamaño y la complejidad de la función

El tamaño y la complejidad de las funciones tienen un impacto directo en la eficiencia de compilación de V8. Las funciones con código conciso, tamaño de función pequeño y menos capas de llamadas anidadas pueden reducir el tiempo de análisis y generación de código de bytes.

  1. Reducir el tamaño de la función:

    • Eliminar código innecesario : verifique la implementación de la función y elimine las variables no utilizadas, el código redundante y el flujo de control innecesario.
    • Divida funciones grandes : divida una función grande en varias funciones más pequeñas para que el compilador V8 pueda procesar cada función más rápido.
    • Utilice funciones en línea : funciones cortas en línea donde se llaman para reducir la sobrecarga de las llamadas a funciones.
  2. Reducir la complejidad de la función:

    • Reducir el anidamiento de bucles : evite las estructuras de bucles anidados de varios niveles, que pueden simplificarse mediante el uso de algoritmos de recursividad o refactorización.
    • Extraiga cálculos comunes : extraiga cálculos repetidos para reducir el tiempo de ejecución del trabajo repetido.
    • Reducir las propiedades y métodos del objeto : intente simplificar y fusionar las propiedades y métodos del objeto para evitar complejidades innecesarias.

2. Evite el uso de funciones dinámicas

Al compilar, V8 hará todo lo posible para realizar una optimización en línea, es decir, reemplazar el lugar donde se llama a la función con el código de implementación de la función llamada, reduciendo así la sobrecarga de las llamadas a funciones. Sin embargo, si la función tiene características dinámicas, como generar funciones dinámicamente a través de eval() o Function(), V8 no puede realizar la optimización en línea, lo que reduce la eficiencia de la compilación.

Para mejorar la eficiencia de compilación de V8, podemos reducir el tiempo de compilación evitando el uso de funciones dinámicas. Las características dinámicas se refieren al uso de tipos dinámicos, análisis dinámico de nombres de variables, enlace dinámico, etc. en el código. Durante la compilación, V8 no puede resolver estas características dinámicas con anticipación, lo que aumenta el tiempo de compilación.

El siguiente es un caso de aplicación práctica para ilustrar cómo mejorar la eficiencia de compilación de V8 evitando el uso de funciones dinámicas.

Supongamos que tenemos una aplicación JavaScript que contiene una función de concatenación dinámica de cadenas. La entrada de esta función es una matriz de objetos y los nombres de propiedad y los valores de propiedad de los objetos pueden ser dinámicos. La función de la función es concatenar los nombres de atributos y los valores de atributos en la matriz de objetos en una cadena y devolverla.

function concatProperty(objArray) {
    
    
  let result = "";
  for (let obj of objArray) {
    
    
    for (let key in obj) {
    
    
      result += key + ": " + obj[key] + ", ";
    }
  }
  return result;
}

let objArray = [
  {
    
     name: "Alice", age: 25 },
  {
    
     name: "Bob", age: 30 },
  {
    
     name: "Charlie", age: 35 }
];

console.log(concatProperty(objArray));

En este ejemplo, utilizamos nombres de propiedad y valores de propiedad dinámicos, de modo que V8 no puede determinar los tipos de nombres de propiedad y valores de propiedad en el momento de la compilación. Esto hará que V8 realice análisis dinámico e inferencia de tipos en tiempo de ejecución, lo que afecta la velocidad de compilación.

Para mejorar la eficiencia de compilación de V8, podemos utilizar algunas técnicas de optimización. Primero, podemos intentar evitar el uso de nombres y valores de propiedad dinámicos. En el ejemplo anterior, si sabemos que los tipos de nombres de atributos y valores de atributos son fijos, podemos usar nombres de atributos y valores de atributos estáticos en lugar de obtener dinámicamente nombres de atributos y valores de atributos de los objetos. De esta manera, V8 puede inferir el tipo de nombre de atributo y valor de atributo en tiempo de compilación, reduciendo el análisis dinámico en tiempo de ejecución.

El código modificado es el siguiente:

function concatProperty(objArray) {
    
    
  let result = "";
  for (let obj of objArray) {
    
    
    result += obj.name + ": " + obj.age + ", ";
  }
  return result;
}

let objArray = [
  {
    
     name: "Alice", age: 25 },
  {
    
     name: "Bob", age: 30 },
  {
    
     name: "Charlie", age: 35 }
];

console.log(concatProperty(objArray));

Al evitar el uso de funciones dinámicas, podemos mejorar la eficiencia de compilación de V8, reducir el análisis dinámico y la inferencia de tipos en tiempo de ejecución y así acelerar la ejecución del código. Esto es especialmente importante para aplicaciones JavaScript grandes y complejas.

3. Evite eval() y with declaraciones

Las declaraciones eval() y with provocarán cambios en la cadena de alcance durante la fase de compilación, lo que dificultará que V8 realice análisis y optimización estáticos. Evite el uso de estas declaraciones tanto como sea posible para mejorar la eficiencia de la compilación.

  1. Evite el uso de eval(): la función eval() puede ejecutar la cadena entrante como código JavaScript, pero esto hará que V8 no se pueda compilar ni optimizar antes de tiempo, lo que afectará el rendimiento. Considere usar otras alternativas, como llamadas a funciones, declaraciones condicionales, etc., para evitar ejecutar código dinámicamente usando eval().

  2. Evite utilizar la instrucción with: la instrucción with crea un nuevo alcance y afecta las capacidades de optimización de V8. Se recomienda utilizar métodos de acceso y declaración de variables convencionales para garantizar la legibilidad y el rendimiento del código.

El siguiente es un caso de aplicación práctica para ilustrar:

Considere el siguiente fragmento de código, que utiliza la función eval() y la instrucción with para realizar acceso dinámico a la propiedad:

function getProperty(obj, prop) {
    
    
  with(obj) {
    
    
    return eval(prop);
  }
}

const obj = {
    
     foo: 10, bar: 20 };
const property = getProperty(obj, "foo");
console.log(property);

Para mejorar la eficiencia de la compilación, el código se puede reescribir para evitar el uso de declaraciones eval() y with, de la siguiente manera:

function getProperty(obj, prop) {
    
    
  return obj[prop];
}

const obj = {
    
     foo: 10, bar: 20 };
const property = getProperty(obj, "foo");
console.log(property);

Al acceder directamente a las propiedades de los objetos sin usar eval() y con declaraciones, V8 puede compilar y optimizar el código con anticipación, mejorando así el rendimiento. De esta forma también es mucho más clara y fácil de entender.

4. Utilice el modo estricto

En modo estricto, V8 puede realizar más análisis y optimización estáticos, mejorando así la eficiencia de la compilación. El modo estricto se habilita con la directiva "usar estricto".
El uso del modo estricto puede mejorar la eficiencia de compilación de V8, principalmente porque el código en modo estricto es más estandarizado y conciso, lo que elimina algunas comprobaciones y conversiones innecesarias, lo que reduce la carga de trabajo de V8 y mejora la velocidad de compilación.

El siguiente es un caso de aplicación práctica para ilustrar cómo mejorar la eficiencia de compilación de V8 mediante el uso del modo estricto.

Supongamos que tenemos un archivo JavaScript con el siguiente contenido:

"use strict";

const name = "John";
let age = 30;

function sayHello() {
    
    
  console.log("Hello, " + name + "! You are " + age + " years old.");
}

sayHello();

En el código anterior, usamos el modo estricto ("usar estricto"), declaramos dos variables nombre y edad y definimos una función decir Hola para imprimir el saludo.

En comparación con el código en modo no estricto, el uso del modo estricto tiene las siguientes ventajas:

  1. Identificación temprana de errores: en modo estricto, las variables no declaradas no se pueden declarar; de lo contrario, se generará un error de referencia. Esto permite a los desarrolladores encontrar errores en una etapa más temprana del código y reducir el tiempo de depuración.

  2. Mejore la eficiencia operativa: en modo estricto, el motor JavaScript puede optimizar mejor el código. Por ejemplo, la función eval y la declaración with están prohibidas en modo estricto y estas características a menudo conducen a una degradación del rendimiento. Al desactivar estas funciones, el motor V8 puede compilar y optimizar de manera más eficiente, aumentando la velocidad de ejecución.

Al utilizar el modo estricto, el compilador V8 puede reducir algunas comprobaciones y operaciones de conversión adicionales durante la compilación, mejorando así la velocidad de compilación. Aunque en este caso el impacto del modo estricto en el tiempo de compilación puede no ser muy notable, para aplicaciones grandes, el uso del modo estricto puede mejorar el rendimiento general.

5. Evite cierres y llamadas de funciones frecuentes

Las llamadas frecuentes a funciones y el uso de cierres aumentan la sobrecarga de análisis y generación de códigos de bytes.
Para mejorar la eficiencia de compilación de V8 evitando llamadas y cierres frecuentes de funciones, se pueden considerar los siguientes aspectos:

  1. Reduzca las llamadas a funciones: evite las llamadas a funciones en cuerpos de bucle y bloques de código ejecutados con frecuencia. Incorpore la lógica de las funciones que deben llamarse con frecuencia al sitio de llamadas para reducir la sobrecarga de las llamadas a funciones.

  2. Evite crear cierres: intente evitar la creación de funciones anónimas o cierres en cuerpos de bucle y bloques de código ejecutados con frecuencia. La creación de cierres provocará una asignación de memoria adicional y una sobrecarga de recolección de basura, lo que afectará el rendimiento.

El siguiente es un caso de aplicación práctica para mostrar cómo mejorar la eficiencia de compilación de V8 evitando llamadas y cierres frecuentes de funciones.

Supongamos que hay una matriz arr, todos los elementos que contiene deben elevarse al cuadrado y los resultados al cuadrado se acumulan. Una implementación tradicional podría usar una map()función y una reduce()función para hacer esto:

const arr = [1, 2, 3, 4, 5];

const squaredSum = arr
  .map((n) => n * n)
  .reduce((sum, n) => sum + n, 0);

console.log(squaredSum);

En el código anterior, map()las reduce()funciones y se llaman con frecuencia y map()se utilizan cierres en las funciones, lo que provocará una pérdida de rendimiento.

map()Para mejorar el rendimiento, la lógica de las funciones de suma se puede reduce()integrar en el sitio de llamada y se pueden evitar los cierres. El método específico es el siguiente:

const arr = [1, 2, 3, 4, 5];

let squaredSum = 0;
for (let i = 0; i < arr.length; i++) {
    
    
  const n = arr[i];
  squaredSum += n * n;
}

console.log(squaredSum);

En el código anterior, hemos utilizado un forbucle en lugar de la map()función de suma reduce(). A través de tales mejoras, se evitan las frecuentes llamadas a funciones y la creación de cierres, y se mejora la eficiencia de compilación de V8.

Cabe señalar que el método anterior es solo un ejemplo simple, y se deben seleccionar y aplicar métodos de optimización específicos de acuerdo con las necesidades reales y los escenarios de aplicación. También puede utilizar las herramientas y métodos proporcionados por V8, como analizar --trace-optla optimización de V8 para optimizar el rendimiento del código JavaScript.

6. Utilice suficiente información de tipo

V8 admite la compilación JIT (Just-In-Time), que se puede compilar dinámicamente según la información de tipo en tiempo de ejecución. En lugares como parámetros de funciones y valores de retorno, intente utilizar tipos específicos en lugar de tipos genéricos, lo que puede mejorar la eficiencia de la compilación.

Al proporcionar suficiente información de tipo para V8, se puede mejorar su eficiencia de compilación. Esto se debe a que V8 es un motor JavaScript basado en un compilador JIT (Just-in-Time), que compila código JavaScript en código máquina eficiente en tiempo de ejecución. La información de tipo ayuda a V8 a tomar decisiones de compilación más precisas y optimizar el código de máquina generado.

Un caso de aplicación práctica es utilizar TypedArray para manejar una gran cantidad de cálculos numéricos. TypedArray es un tipo de matriz especial en JavaScript que nos permite manipular directamente datos binarios en la memoria para lograr cálculos numéricos de alto rendimiento.

Supongamos que tenemos una aplicación que necesita realizar algunas operaciones numéricas en una matriz de un millón de elementos, como suma, promedio, etc. Podemos usar TypedArray para definir el tipo de esta matriz e informarle a V8 sobre la información de tipo de cada elemento.

Aquí hay un código de muestra usando TypedArray:

// 创建一个包含一百万个元素的Float64Array
const array = new Float64Array(1000000);

// 填充数组
for (let i = 0; i < 1000000; i++) {
    
    
  array[i] = Math.random();
}

// 计算数组的总和
let sum = 0;
for (let i = 0; i < 1000000; i++) {
    
    
  sum += array[i];
}

console.log(sum);

En este ejemplo, usamos el tipo Float64Array para definir el tipo de matriz, indicando a V8 que la matriz contiene números de punto flotante de 64 bits. Al proporcionar información de tipo, V8 puede optimizar el código en tiempo de compilación y generar código de máquina más eficiente.

En resumen, al utilizar suficiente información de tipo, como TypedArray para definir el tipo de variables, puede ayudar a V8 a tomar decisiones de compilación más precisas y generar código de máquina más eficiente, mejorando así la eficiencia de compilación de V8.

En resumen, la compilación V8 se puede mejorar optimizando el tamaño y la complejidad de la función, evitando características dinámicas, evitando eval() y con declaraciones, usando el modo estricto, evitando llamadas y cierres frecuentes de funciones y utilizando suficiente eficiencia de información de tipos.

2. Optimización de objetos

V8 es un motor JavaScript de alto rendimiento que compila código JavaScript en código de máquina para su ejecución. En V8, la operación de agregar, eliminar, modificar y consultar objetos implicará operaciones como acceso a atributos de objetos, inserción o eliminación de atributos y modificación de atributos.

V8 utiliza mecanismos como clases ocultas (Clase oculta) y caché en línea (Inline Cache) para mejorar la eficiencia del acceso a los objetos. Una clase oculta es un mecanismo de vinculación en tiempo de compilación para las propiedades del objeto y los valores correspondientes, que se utiliza para rastrear la forma y el diseño de las propiedades del objeto. Cuando las propiedades del objeto cambian, juzgará si la clase oculta necesita actualizarse de acuerdo con la información de la clase oculta, reduciendo así el costo de modificación de la propiedad del objeto. El almacenamiento en caché en línea es un mecanismo de almacenamiento en caché que se utiliza para almacenar en caché las rutas de acceso de los atributos. A través del almacenamiento en caché en línea, V8 puede reducir el costo de búsqueda del acceso a atributos y acelerar el acceso.

Para mejorar la eficiencia de compilación de V8, podemos seguir los siguientes puntos:

  1. Evite la inserción o eliminación frecuente de atributos: la modificación frecuente de los atributos del objeto provocará cambios en las clases ocultas y afectará el rendimiento. Si necesita modificar atributos con frecuencia, puede considerar usar estructuras de datos como matrices o encapsular atributos en variables internas.

  2. Evite el uso de nombres de propiedades dinámicas: el uso de nombres de propiedades dinámicas dificulta que V8 optimice el acceso a los objetos. Si se requieren nombres de propiedades dinámicas, considere almacenar las propiedades en un objeto Map.

  3. Evite el acceso frecuente a las propiedades: el acceso frecuente a las propiedades de un objeto también puede afectar el rendimiento. Si se accede a una propiedad con frecuencia, se puede almacenar en una variable local para reducir el costo de las búsquedas de propiedades.

  4. Evite modificar el mismo atributo varias veces: modificar el mismo atributo varias veces dará como resultado múltiples cambios de clases ocultos y afectará el rendimiento. Si necesita modificar atributos varias veces, puede combinar las operaciones de modificación en una sola modificación.

A continuación se muestra un ejemplo sencillo para ilustrar:

// 不推荐的写法
function updateObject(obj, prop, value) {
    
    
  if (!obj.hasOwnProperty(prop)) {
    
    
    obj[prop] = value;
  } else {
    
    
    obj[prop] += value;
  }
}

// 推荐的写法
function updateObject(obj, prop, value) {
    
    
  const oldValue = obj[prop] || 0;
  obj[prop] = oldValue + value;
}

En la forma de escritura no recomendada, cada vez que modifica el atributo de un objeto, primero debe determinar si el atributo existe y luego realizar la operación correspondiente, lo que provocará un acceso y modificación frecuentes del atributo. En el método de escritura recomendado, primero almacenamos el valor del atributo en una variable local y luego lo modificamos, evitando el costo del acceso y modificación de múltiples atributos, mejorando así la eficiencia de compilación de V8.

En una palabra, la eficiencia de compilación de V8 se puede mejorar manipulando racionalmente los atributos de los objetos y evitando operaciones frecuentes de atributos.

Resumir

En la optimización del rendimiento del front-end, la optimización del código JavaScript es una parte muy importante. La escritura de código razonable, el desarrollo modular, la carga asincrónica, la compresión y el almacenamiento en caché pueden mejorar efectivamente la velocidad de respuesta de la página y la experiencia del usuario. Debemos prestar atención a indicadores como el tamaño del archivo JavaScript, el tiempo de ejecución y la cantidad de solicitudes en la página, y optimizarlos de manera específica. Al mismo tiempo, también es necesario prestar atención tanto a la experiencia del usuario como a la capacidad de mantenimiento del código, para mejorar el rendimiento sin afectar la expansión y el mantenimiento del código. Espero que este artículo pueda ayudar a los lectores a comprender y aplicar mejor los métodos de optimización de JavaScript y mejorar su nivel técnico de front-end.

Supongo que te gusta

Origin blog.csdn.net/jieyucx/article/details/132489433
Recomendado
Clasificación