Ir al contenido

Rendimiento

Lo rápida y lo pequeña que es esta librería, junto a su versión principal anterior y las demás librerías de npm que validan identificadores españoles. Todas las cifras de esta página se leen de bench/results/latest.json al generar el sitio: no se escribe nada a mano. Si una librería es más rápida o más pequeña en algo, las tablas lo muestran.

Dónde y cómo se ejecutó el benchmark
MáquinaAMD EPYC 9V74 80-Core Processor
Núcleos4
Memoria16 GiB
Sistema operativolinux 6.17.0-1022-azure (x64)
Node.jsv24.21.0
Fecha2 de octubre de 2026
Commit medido1166241
Método3 rondas; cada tarea, 2000 ms tras 500 ms de calentamiento, en su propio proceso; la cifra es la de la ronda mediana

Las cifras absolutas dependen de la máquina. Las proporciones entre las librerías de una misma ejecución se mantienen mucho mejor de una máquina a otra, así que compara esas.

Millones de validaciones por segundo (M ops/s; cuanto mayor sea la cifra, más rápida es), con cada librería llamada como indica su documentación, con sus opciones por defecto, sobre los mismos documentos válidos y no válidos en forma canónica. «Rendimiento relativo» indica la proporción entre el rendimiento de esta versión y el de cada librería, en la misma ejecución. no admitido significa que la librería no tiene validador para ese tipo.

DNI: millones de validaciones por segundo (M ops/s; cuanto mayor sea la cifra, más rápida es) con 225 documentos válidos y no válidos en forma canónica, y la proporción entre el rendimiento de esta versión y el de cada librería
LibreríaM ops/sRendimiento relativo
nif-dni-nie-cif-validation esta versión60,12—
@maistik/validate-nif 2.0.19,466,4× el rendimiento
dni-js 1.0.08,906,8× el rendimiento
nif-dni-nie-cif-validation 1.0.118,597,0× el rendimiento
better-dni 4.4.28,447,1× el rendimiento
spain-id 1.1.146,968,6× el rendimiento
validator.js isIdentityCard(x, "ES") 13.15.355,7310,5× el rendimiento
validator.js isTaxID(x, "es-ES") 13.15.354,2214,3× el rendimiento
@kreyo/nif-validator 0.1.02,7821,6× el rendimiento
jsvat 2.5.42,1028,6× el rendimiento
stdnum 1.12.60,41146,3× el rendimiento

Ninguna otra librería fue más rápida con el conjunto DNI.

NIE: millones de validaciones por segundo (M ops/s; cuanto mayor sea la cifra, más rápida es) con 150 documentos válidos y no válidos en forma canónica, y la proporción entre el rendimiento de esta versión y el de cada librería
LibreríaM ops/sRendimiento relativo
nif-dni-nie-cif-validation esta versión57,60—
@maistik/validate-nif 2.0.18,396,9× el rendimiento
better-dni 4.4.28,177,1× el rendimiento
nif-dni-nie-cif-validation 1.0.116,449,0× el rendimiento
dni-js 1.0.04,4912,8× el rendimiento
spain-id 1.1.144,0114,4× el rendimiento
validator.js isTaxID(x, "es-ES") 13.15.353,4216,8× el rendimiento
validator.js isIdentityCard(x, "ES") 13.15.353,1418,4× el rendimiento
@kreyo/nif-validator 0.1.02,6521,7× el rendimiento
jsvat 2.5.41,5936,2× el rendimiento
stdnum 1.12.60,39146,0× el rendimiento

Ninguna otra librería fue más rápida con el conjunto NIE.

CIF: millones de validaciones por segundo (M ops/s; cuanto mayor sea la cifra, más rápida es) con 270 documentos válidos y no válidos en forma canónica, y la proporción entre el rendimiento de esta versión y el de cada librería
LibreríaM ops/sRendimiento relativo
nif-dni-nie-cif-validation esta versión55,06—
@maistik/validate-nif 2.0.17,747,1× el rendimiento
nif-dni-nie-cif-validation 1.0.117,277,6× el rendimiento
spain-id 1.1.144,5012,2× el rendimiento
@kreyo/nif-validator 0.1.02,5022,0× el rendimiento
jsvat 2.5.42,3723,2× el rendimiento
stdnum 1.12.60,38146,7× el rendimiento
better-dni 4.4.2no admitidono admitido
dni-js 1.0.0no admitidono admitido
validator.js isIdentityCard(x, "ES") 13.15.35no admitidono admitido
validator.js isTaxID(x, "es-ES") 13.15.35no admitidono admitido

Ninguna otra librería fue más rápida con el conjunto CIF.

La velocidad no lo es todo, y estas cifras dejan cosas fuera: la memoria, la primera llamada antes de que el JIT se caliente, la entrada que necesita normalización y el coste del resultado detallado de validate(). Una librería que rechaza pronto una cadena es rápida con ella, y por eso la concordancia con SPEC.md se mide aparte, más abajo.

Lo que añade un validador a un bundle, minificado y comprimido con gzip (min+gzip; cuanto menor sea la cifra, más pequeña es), empaquetado con esbuild como hace la comprobación de tamaño de la propia librería. La barra de una librería mucho más grande que las demás se dibuja completa, con el final cortado.

Tamaño de un validador de cualquier tipo (min+gzip; cuanto menor sea la cifra, más pequeño es)
LibreríaCualquier tipo
@maistik/validate-nif 2.0.1456 B
@kreyo/nif-validator 0.1.0533 B
spain-id 1.1.14583 B
dni-js 1.0.0882 B
nif-dni-nie-cif-validation esta versión929 B
better-dni 4.4.21134 B
jsvat 2.5.41186 B
nif-dni-nie-cif-validation 1.0.111517 B
validator.js isIdentityCard(x, "ES") 13.15.352539 B
validator.js isTaxID(x, "es-ES") 13.15.356537 B
stdnum 1.12.651.063 B

Más pequeñas que esta versión para un validador de cualquier tipo: @maistik/validate-nif 2.0.1 (456 B), @kreyo/nif-validator 0.1.0 (533 B), spain-id 1.1.14 (583 B) y dni-js 1.0.0 (882 B). También se ha medido stdnum 1.12.6 con una importación directa de su módulo del NIF español (no documentada): 2468 B.

Algunas librerías más pequeñas validan menos tipos. Esta dedica bytes a normalizar la entrada, a los tipos de control de CIF-3 y a los NIF K/L/M. Las librerías publicadas solo como CommonJS no admiten tree shaking, así que una de sus funciones cuesta la librería entera. Las librerías de muchos países o de propósito general, como stdnum y validator.js, son más grandes por diseño.

Tamaño de un validador de cada tipo y de la librería completa (min+gzip; cuanto menor sea la cifra, más pequeño es)
LibreríaDNINIECIFCualquier tipoLibrería completa
@maistik/validate-nif 2.0.1215 B243 B319 B456 B1189 B
@kreyo/nif-validator 0.1.0533 B533 B533 B533 B746 B
spain-id 1.1.14165 B237 B363 B583 B704 B
dni-js 1.0.0883 B882 Bno admitido882 B880 B
nif-dni-nie-cif-validation esta versión623 B586 B568 B929 B4679 B
better-dni 4.4.21135 B1135 Bno admitido1134 B1132 B
jsvat 2.5.41186 B1186 B1186 B1186 B5266 B
nif-dni-nie-cif-validation 1.0.111517 B1517 B1518 B1517 B1514 B
validator.js isIdentityCard(x, "ES") 13.15.352539 B2539 Bno admitido2539 B44.449 B
validator.js isTaxID(x, "es-ES") 13.15.356537 B6537 Bno admitido6537 B44.449 B
stdnum 1.12.651.063 B51.063 B51.063 B51.063 B51.054 B

El porcentaje de los casos de prueba de la librería (opciones por defecto) que cada librería juzga igual que SPEC.md: válidos o no válidos.

Concordancia con SPEC.md (no corrección absoluta): el porcentaje de casos que cada librería juzga igual que SPEC.md, en todos ellos y solo en la entrada canónica
LibreríaTodos los casosSolo entrada canónica
nif-dni-nie-cif-validation esta versión100,0 %100,0 %
nif-dni-nie-cif-validation 1.0.1184,0 %92,2 %
spain-id 1.1.1482,4 %85,4 %
better-dni 4.4.271,9 %86,7 %
dni-js 1.0.073,4 %86,7 %
stdnum 1.12.676,8 %77,7 %
validator.js isIdentityCard(x, "ES") 13.15.3575,0 %86,7 %
validator.js isTaxID(x, "es-ES") 13.15.3584,4 %100,0 %
@maistik/validate-nif 2.0.182,4 %86,4 %
@kreyo/nif-validator 0.1.082,4 %86,4 %
jsvat 2.5.486,4 %89,3 %
Concordancia con SPEC.md por tipo de documento, y las discrepancias debidas a decisiones que SPEC.md documenta
LibreríaDNINIECIFK/L/MDiscrepanciasPor una decisión documentada
nif-dni-nie-cif-validation esta versión100,0 %100,0 %100,0 %100,0 %00
nif-dni-nie-cif-validation 1.0.1173,3 %88,9 %83,6 %100,0 %2013
spain-id 1.1.1490,0 %77,8 %86,9 %36,4 %2213
better-dni 4.4.273,3 %77,8 %no admitido45,5 %187
dni-js 1.0.076,7 %77,8 %no admitido45,5 %177
stdnum 1.12.690,0 %83,3 %63,9 %100,0 %2929
validator.js isIdentityCard(x, "ES") 13.15.3580,0 %77,8 %no admitido45,5 %166
validator.js isTaxID(x, "es-ES") 13.15.3580,0 %77,8 %no admitido100,0 %105
@maistik/validate-nif 2.0.186,7 %77,8 %86,9 %45,5 %2214
@kreyo/nif-validator 0.1.086,7 %77,8 %86,9 %45,5 %2214
jsvat 2.5.490,0 %83,3 %82,0 %100,0 %1717

Un tipo que una librería no valida se excluye de sus cifras, así que compara las columnas, y no «Todos los casos», entre librerías de distinto alcance. La lista de discrepancias de cada librería, con un ejemplo de cada una, está en latest.md (en inglés).

  • Entradas. Se generan con un generador pseudoaleatorio con semilla, así que todas las ejecuciones y todas las máquinas miden las mismas cadenas: documentos válidos y los mismos documentos con un carácter de control incorrecto, para cada tipo.
  • Llamadas. Cada librería se llama exactamente como indica su documentación, con sus opciones por defecto, sobre la cadena de entrada sin procesar. La única excepción es jsvat, un validador de NIF-IVA, a cuyas entradas se les añade el prefijo ES fuera del bucle cronometrado.
  • Medición. tinybench ejecuta cada tarea en su propio proceso, tras un calentamiento, para que lo que V8 aprende de una librería no cambie la cifra de la siguiente. La ejecución completa se repite en varias rondas, el orden de las librerías rota entre conjuntos y rondas, y cada cifra es la de la ronda mediana.
  • Tamaño. La importación de una sola función que documenta cada librería, empaquetada y minificada con esbuild y comprimida con gzip al nivel 9, menos el coste de una importación vacía.
  • Concordancia. La llamada «cualquier tipo» de cada librería sobre los casos que prueban las opciones por defecto, juzgando cada caso como válido o no válido.

La metodología completa, sus salvedades y el esquema de los resultados están en bench/README.md (en inglés).

Las librerías se instalan en versiones exactas, así que una ejecución mide exactamente lo que recoge latest.json. Cierra antes los demás programas, y compara proporciones en lugar de cifras absolutas:

Ventana de terminal
git clone https://github.com/josegoval/nif-dni-nie-cif-validation.git
cd nif-dni-nie-cif-validation
pnpm install --frozen-lockfile
pnpm bench:competitors # unos 5 minutos; escribe bench/results/latest.json y latest.md

pnpm bench compara en cambio cada validador con la versión 1. Un flujo de trabajo de GitHub Actions ejecuta el mismo benchmark bajo demanda, en un runner compartido, y sube los resultados.