stringtranslate.com

pasantía de cuerdas

En informática, el internamiento de cadenas es un método para almacenar solo una copia de cada valor de cadena distinto , que debe ser inmutable . [1] La internación de cadenas hace que algunas tareas de procesamiento de cadenas sean más eficientes en tiempo o espacio a costa de requerir más tiempo cuando se crea o interna la cadena. Los valores distintos se almacenan en un grupo interno de cadenas .

La copia única de cada cadena se llama interna y normalmente se busca mediante un método de la clase de cadena, por ejemplo String.intern() [2] en Java . Todas las cadenas constantes en tiempo de compilación en Java se internan automáticamente mediante este método. [3]

La pasantía de cadenas es compatible con algunos lenguajes de programación modernos orientados a objetos , incluidos Java, Python , PHP (desde 5.4), Lua [4] y .NET . [5] Lisp , Scheme , Julia , Ruby y Smalltalk se encuentran entre los lenguajes con un tipo de símbolo que son básicamente cadenas internas. La biblioteca del Standard ML de Nueva Jersey contiene un tipo que hace lo mismo. Los selectores de Objective-C , que se utilizan principalmente como nombres de métodos, son cadenas internas. atom

Se pueden internar objetos distintos de cadenas. Por ejemplo, en Java, cuando los valores primitivos se encuadran en un objeto contenedor , ciertos valores (cualquiera boolean, cualquiera byte, cualquiera charde 0 a 127 y cualquiera shorto intentre −128 y 127) se internan y dos conversiones de boxeo cualesquiera de uno de estos Se garantiza que los valores darán como resultado el mismo objeto. [6]

Historia

Lisp introdujo la noción de cadenas internas para sus símbolos . Históricamente, la estructura de datos utilizada como grupo interno de cadenas se denominaba oblist (cuando se implementaba como una lista vinculada) o obarray (cuando se implementaba como una matriz).

Los dialectos Lisp modernos suelen distinguir símbolos de cadenas; internar una cadena determinada devuelve un símbolo existente o crea uno nuevo, cuyo nombre es esa cadena. Los símbolos a menudo tienen propiedades adicionales que las cadenas no tienen (como el almacenamiento de valores asociados o el espacio de nombres): la distinción también es útil para evitar comparar accidentalmente una cadena interna con una cadena no necesariamente internada, lo que podría provocar fallas intermitentes dependiendo de patrones de uso.

Motivación

La pasantía de cadenas acelera las comparaciones de cadenas, que a veces son un cuello de botella en el rendimiento en aplicaciones (como compiladores y tiempos de ejecución de lenguajes de programación dinámicos ) que dependen en gran medida de matrices asociativas con claves de cadena para buscar los atributos y métodos de un objeto. Sin hacer prácticas, comparar dos cadenas distintas puede implicar examinar cada carácter de ambas. [Nota 1] Esto es lento por varias razones: es inherentemente O(n) en la longitud de las cadenas; normalmente requiere lecturas de varias regiones de la memoria , lo que lleva tiempo; y las lecturas llenan el caché del procesador, lo que significa que hay menos caché disponible para otras necesidades. Con cadenas internas, una simple prueba de identidad del objeto es suficiente después de la operación interna original; Esto generalmente se implementa como una prueba de igualdad de punteros, normalmente solo una instrucción de máquina sin ninguna referencia a la memoria.

El internamiento de cadenas también reduce el uso de memoria si hay muchas instancias del mismo valor de cadena; por ejemplo, se lee desde una red o desde un almacenamiento . Estas cadenas pueden incluir números mágicos o información de protocolo de red . Por ejemplo, los analizadores XML pueden introducir nombres de etiquetas y atributos para ahorrar memoria. La transferencia de red de objetos a través de flujos de objetos de serialización RMI de Java puede transferir cadenas que se internan de manera más eficiente, ya que el identificador del objeto String se usa en lugar de objetos duplicados durante la serialización. [7]

Asuntos

subprocesos múltiples

Si las cadenas internas no son inmutables, una fuente de inconvenientes es que la internación de cadenas puede ser problemática cuando se mezcla con subprocesos múltiples . En muchos sistemas, se requiere que los pasantes de cadena sean globales en todos los subprocesos dentro de un espacio de direcciones (o en cualquier contexto que pueda compartir punteros), por lo tanto, los grupos de pasantes son recursos globales que deben sincronizarse para un acceso simultáneo seguro. Si bien esto solo afecta la creación de cadenas (donde el grupo interno debe verificarse y modificarse si es necesario), y el bloqueo de doble verificación se puede usar en plataformas donde se trata de una optimización segura, la necesidad de exclusión mutua al modificar el grupo interno puede ser costosa. . [8]

La contención también se puede reducir dividiendo el espacio de cadenas en varios grupos, que se pueden sincronizar independientemente unos de otros.

Recuperar cadenas internas no utilizadas

Muchas implementaciones de cadenas internas no intentan recuperar (manualmente o de otro modo) cadenas que ya no se utilizan. Para aplicaciones donde el número de cadenas internas es pequeño o fijo, o que tienen una vida corta, la pérdida de recursos del sistema puede ser tolerable. Pero para sistemas de larga duración donde se crean una gran cantidad de pasantes de cadena en tiempo de ejecución, puede surgir la necesidad de recuperar pasantes no utilizados. Esta tarea puede ser manejada por un recolector de basura , aunque para que esto funcione correctamente, se deben almacenar referencias débiles a cadenas internas en el grupo de internos.

Ver también

Notas

  1. ^ La comparación de cadenas puede detenerse cuando el primer carácter no coincide. Para una igualdad estricta, las longitudes de las cadenas también se pueden comparar antes de atravesar la cadena: pero encontrar la longitud de las cadenas terminadas en nulo requiere atravesar la cadena.

Referencias

  1. ^ "Método String.Intern (Cadena)". Red de desarrolladores de Microsoft . Consultado el 25 de marzo de 2017 .
  2. ^ String.intern()
  3. ^ "Capítulo 15. Expresiones". docs.oracle.com . Consultado el 30 de enero de 2019 .
  4. ^ "wiki de usuarios de lua: objetos inmutables". lua-users.org . Consultado el 30 de enero de 2019 .
  5. ^ rpetrusha. "Clase de cadena (sistema)". docs.microsoft.com . Consultado el 30 de enero de 2019 .
  6. ^ "Capítulo 5. Conversiones y promociones". docs.oracle.com . Consultado el 30 de enero de 2019 .
  7. ^ "Especificación de serialización de objetos Java: 1 - Arquitectura del sistema". docs.oracle.com . Consultado el 30 de enero de 2019 .
  8. ^ "String.intern en Java 6, 7 y 8: acceso multiproceso". java-rendimiento.info . 3 de septiembre de 2013 . Consultado el 30 de enero de 2019 .

enlaces externos