fmt
Rendimiento de fmt: crecimiento del búfer, formatos compilados y mediciones
Inspecciona los 500 elementos internos y la política de crecimiento; separa comprobación, FMT_COMPILE, asignación, E/S y coste de construcción.
Qué aprenderás
- Una política concreta no promete cero asignaciones
- Comprobar no equivale a compilar el formateador
- Mide el trabajo que paga la aplicación
Antes de empezar
- Valores, referencias, cadenas y destinos de construcción en C++
- Distinguir expectativas documentadas de resultados medidos
Traza comportamientos concretos de fmt y elige una integración con límites explícitos de salida, vida útil y verificación.
Conclusiones clave
- Los 500 elementos internos pertenecen a un tipo y una revisión concretos.
- Los formatos compilados intercambian especialización por posible crecimiento binario.
- Mide formato, asignación, E/S y construcción por separado; no inventes ahorros.
Una política concreta no promete cero asignaciones
En esta revisión, basic_memory_buffer usa por defecto 500 elementos internos; su alias habitual de char empieza con 500 bytes internos de caracteres. El crecimiento calcula old_capacity + old_capacity / 2 y después considera una petición mayor y los límites del asignador. Es una política específica que puede leerse y comprobarse.
El ejemplo aritmético simplificado omite deliberadamente límites del asignador y desbordamientos, y solo admite valores pequeños no negativos. Predice capacidad 750 al pasar de 500 para satisfacer 501, y 900 si la petición exige 900. Describe esa política, no rendimiento medido ni ausencia de asignaciones en todas las llamadas: convertir el búfer a std::string puede asignar memoria adicional.
Comprobar no equivale a compilar el formateador
La comprobación literal detecta incompatibilidades en configuraciones C++20 soportadas. FMT_COMPILE analiza un formato fijo y genera código especializado en la ruta compatible. La macro de compile.h necesita facilidades constexpr-if de C++17 para esa ruta y utiliza FMT_STRING como alternativa. Las capacidades del compilador cambian lo que una misma invocación hace realmente.
La guía advierte que los formatos compilados pueden aumentar el código binario y los recomienda en cuellos de botella demostrados. Compara puntos calientes representativos, no sustituyas mecánicamente todas las cadenas. Informa de tiempo de compilación, tamaño enlazado y ejecución: ganar en un bucle aislado puede resultar mal para una aplicación con muchos formatos distintos.
Mide el trabajo que paga la aplicación
Separa formato de cadenas, asignación y E/S en fases de medición. Mantén valores, reglas de presentación, optimización y herramientas iguales, y consume el resultado para impedir que el compilador elimine el trabajo. Incluye mensajes cortos y largos, reutilización de búferes y tipos propios representativos, no solo un caso entero favorable.
formatted_size recorre el formato con un búfer contador, y format_to_n sigue contando la salida sin truncar. Calcular tamaño y después formatear no es automáticamente una optimización gratuita; limitar la escritura tampoco demuestra un coste de CPU acotado para anchuras enormes. Esta revisión no publica cifras comparativas inventadas de rendimiento, latencia, asignaciones o ahorro monetario.
Pasos de implementación
- 1
Fija revisión, compilador, optimización y entradas representativas.
- 2
Separa formato de latencia del dispositivo de salida.
- 3
Compara ruta normal, reutilización y algunos formatos calientes compilados.
- 4
Publica efectos de construcción y deja desconocidos los valores no medidos.
Ejemplo para copiar
function teachingCapacity(oldCapacity, requested) {
return Math.max(oldCapacity + Math.floor(oldCapacity / 2), requested);
}
console.log(teachingCapacity(500, 501), teachingCapacity(500, 900));
// 750 900; modelo pequeño, no asignador ni prueba de rendimientoPreguntas frecuentes
¿Un búfer interno demuestra que fmt::format nunca asigna memoria?
No. Las salidas grandes pueden ampliar el búfer y el std::string devuelto tiene su propio comportamiento de almacenamiento.
¿Conviene usar FMT_COMPILE en todos los literales?
No sin mediciones. La guía upstream señala posible crecimiento binario y lo recomienda para cuellos de botella confirmados.
Fuentes
- README.mdFuente verificada 2026-09-08
- doc/api.mdFuente verificada 2026-09-08
- include/fmt/core.hFuente verificada 2026-09-08
- include/fmt/format.hFuente verificada 2026-09-08
- include/fmt/compile.hFuente verificada 2026-09-08