Con esto evitamos varias copias y no perdemos la semantica...
aparte con un reserve bueno (heuristica), esto mejora:
```mql5
staticstringmsg;
msg.Reserve(256);
```
Nota que aqui uso static dado que si podemos verificar que:
- El primer uso del string es de asignacion =
- En caso antes de esa sainacino se llame a una funcion veriicamos que esta la asinga antes de leer estado
Entonces es seguro si por ejemplo la funcion que llammoas necinta ya un stirng con ceirto valor entonces esa
funcion iria luego.. no ANTES.. ..la idea es eso..
7. Funciones "despachadoras": un ejemplo:
```mql5
stringEmoji(intvalor)
{
if(valor==1){return"..."}
elseif(valor==3){return"..."}
.
.
.
}
```
Este tipo de funciones son medio costoas asi que lo mejor es pensar en esto:
- si el valor es numerico:
> - El valor esta acotado?¿ o es un bool...: usa una tabla constante o un uchar[fixed_size] si contruyes un buffer en vez de string, esto es comun pro ejemplo
con enums.. ENUM_POSITION_TYPE que tiene dos valores 0\1 o ENUM_ORDER_TYPE, por dar algunos ejemplos.. depend edel enum, etc..
> - Si el valor es mas complejo... entonces peudes probar con bit tricks quizas un brujin que mappee un patron de bits..
a una poscion de la tabla de 32/64/16 posicone sy usar un string ahi...
> - Otra opcion es usar perfect hash... (poir eemplo con SimpHash) pero esto solo si justica 10+strings en juego y patron complejo
> - Por ultimo si valor es medio compejo de mapearlo o dende de logica seuncinal.. peudes algemos reoduanr el if poir mas "probale" o como arbol binario
> - En todo caso ya diste por todas las oslcuiones.... me poondira a pneasr que tanto se llama.. o si es critico para evalaur quizas un perfect hash mas heleprs o
acpetar el traderoff si no se llama mucho, o como mencione inlinearlo almenos (aunque zuais esto no sea la mejor opcion en codigo grande)
6. Usa const string&: esto es una optizmacion basica... noramlte en funciones pasas string pero como ya lo mecione
al no poder ver un asm etc.. no sabemos si se crea una copia completa.. o el compialdo optimzia y lo usa como con string&
o toma pretad el puntero... etc.. pro eso es mejor aseguraranos.... aveces la difnica se nota y aveces no
depende de lo que hagas con ese string, aparte el compiadlr no estan agresivo.
Ahora no siempre lo usamreos hay un problea con usar constr string& y es que no peudes hacer esto
funcion(Funcion2()) solo esto:
funcion("hola") o funcion(var)...
Esto por qeu const string& pide una variable y parece ser que apra "" se genrea una temporal et (la verdad es un ahipotesis
no una afrimacion) el tema es que con Funcion2 parece que se genrea un valor temporal el cual no "podemos" tomar
hay que matiel en un registro.. en ese caso duplicar una funcion completa para ofreces dos veriones
lo miraria con pinzas si la ufncion es chica o con un aglortimo que poco cambia quizas si con un amcro
si es el core logic.. ahi si por tradeoff quizas acpetar eso... y usar const string que en teoria podria ayudar al compilador..
2026-10-29 12:55:54 -05:00
7. Funciones que retornan string cuestan mas que las que lo pasan como ref.. trata de que
cuando uses strigns no usar much ofuncioens que lo retorne,
8. Si los strings son globales\const, usa uchar fixed[5] para repsetnarlos y copiamos con arraycopy (en buffer) o en la foramd el paso 9...
9. CharArrayToString no siempre es mas rapido que for() arr[i]=(uchar)StringGetCharacter() ... depende del tamaño (alrediode de < 60 chars)..
Asi que ve rotando... apart ienes que evaluar si reuiqer utf8 o es "plain asssci" basico para aplicar esta optimcion