Estoy trabajando en un código de alto rendimiento en el que esta construcción es parte de la sección de rendimiento crítico.Creación de cadenas inseguras a partir de char []
Esto es lo que sucede en alguna sección:
- Un
string
es escaneado y metadatos se almacena de manera eficiente. - Según estos metadatos, los trozos de la cadena principal están separados en
char[][]
. - Eso
char[][]
se debe transferir astring[]
.
Ahora, sé que sólo puede llamar new string(char[])
pero entonces el resultado tendría que ser copiado.
Para evitar que ocurra este paso de copia adicional, supongo que debe ser posible escribir directamente en el búfer interno de la cadena. Aunque esto sería una operación insegura (y sé que esto trae muchas implicaciones, como desbordamiento, compatibilidad con versiones anteriores).
He visto varias formas de lograr esto, pero no estoy realmente satisfecho con ninguna.
¿Alguien tiene sugerencias verdaderas sobre cómo lograr esto?
información adicional:
El proceso actual no incluye la conversión a char[]
necesariamente, es prácticamente una operación de 'multi-subcadena'. Como 3 índices y sus longitudes anexadas.
El StringBuilder
tiene demasiada sobrecarga para la pequeña cantidad de concats.
EDIT:
Debido a algunos aspectos imprecisos de lo que es exactamente eso lo que te pido, le formularé de ella.
Esto es lo que sucede:
- cadena principal está indexado.
- Las partes de la cadena principal se copian a
char[]
. - El
char[]
se convierte enstring
.
Lo que me gustaría hacer es fusionar el paso 2 y 3, lo que resulta en:
- cadena principal está indexado.
- Las partes de la cadena principal se copian a
string
(y el GC puede mantener sus manos alejadas durante el proceso mediante el uso adecuado de la palabra clavefixed
?).
Y una nota es que no puede cambio el tipo de salida de string [], ya que esta es una biblioteca externa, y los proyectos dependen de él (compatibilidad con versiones anteriores).
¿Qué tienes que hacer con las cuerdas después de todo esto? Es decir, en lugar de tratar de encontrar formas de mapear a 'string []' sin copiar de nuevo, ¿puede traerlo como un 'char []' y luego almacenar los pares 'int, int' de la posición y longitud del las subpartes que necesita, haciendo referencia a la matriz original para extraer las subcadenas cuando las necesite? –
No estoy seguro del código que intentas mejorar aquí. –
La clase de cadena es especial; es por definición inmutable e implica copiar. Tratar de eludir esto es pedir problemas con el GC y otro código administrado (las cadenas se agrupan). – Nikki9696