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.
| Máquina | AMD EPYC 9V74 80-Core Processor |
|---|---|
| Núcleos | 4 |
| Memoria | 16 GiB |
| Sistema operativo | linux 6.17.0-1022-azure (x64) |
| Node.js | v24.21.0 |
| Fecha | 2 de octubre de 2026 |
| Commit medido | 1166241 |
| Método | 3 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.
Velocidad
Sección titulada «Velocidad»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.
| Librería | M ops/s | Rendimiento relativo |
|---|---|---|
| nif-dni-nie-cif-validation esta versión | — | |
| @maistik/validate-nif 2.0.1 | 6,4× el rendimiento | |
| dni-js 1.0.0 | 6,8× el rendimiento | |
| nif-dni-nie-cif-validation 1.0.11 | 7,0× el rendimiento | |
| better-dni 4.4.2 | 7,1× el rendimiento | |
| spain-id 1.1.14 | 8,6× el rendimiento | |
| validator.js isIdentityCard(x, "ES") 13.15.35 | 10,5× el rendimiento | |
| validator.js isTaxID(x, "es-ES") 13.15.35 | 14,3× el rendimiento | |
| @kreyo/nif-validator 0.1.0 | 21,6× el rendimiento | |
| jsvat 2.5.4 | 28,6× el rendimiento | |
| stdnum 1.12.6 | 146,3× el rendimiento |
Ninguna otra librería fue más rápida con el conjunto DNI.
| Librería | M ops/s | Rendimiento relativo |
|---|---|---|
| nif-dni-nie-cif-validation esta versión | — | |
| @maistik/validate-nif 2.0.1 | 6,9× el rendimiento | |
| better-dni 4.4.2 | 7,1× el rendimiento | |
| nif-dni-nie-cif-validation 1.0.11 | 9,0× el rendimiento | |
| dni-js 1.0.0 | 12,8× el rendimiento | |
| spain-id 1.1.14 | 14,4× el rendimiento | |
| validator.js isTaxID(x, "es-ES") 13.15.35 | 16,8× el rendimiento | |
| validator.js isIdentityCard(x, "ES") 13.15.35 | 18,4× el rendimiento | |
| @kreyo/nif-validator 0.1.0 | 21,7× el rendimiento | |
| jsvat 2.5.4 | 36,2× el rendimiento | |
| stdnum 1.12.6 | 146,0× el rendimiento |
Ninguna otra librería fue más rápida con el conjunto NIE.
| Librería | M ops/s | Rendimiento relativo |
|---|---|---|
| nif-dni-nie-cif-validation esta versión | — | |
| @maistik/validate-nif 2.0.1 | 7,1× el rendimiento | |
| nif-dni-nie-cif-validation 1.0.11 | 7,6× el rendimiento | |
| spain-id 1.1.14 | 12,2× el rendimiento | |
| @kreyo/nif-validator 0.1.0 | 22,0× el rendimiento | |
| jsvat 2.5.4 | 23,2× el rendimiento | |
| stdnum 1.12.6 | 146,7× el rendimiento | |
| better-dni 4.4.2 | no admitido | no admitido |
| dni-js 1.0.0 | no admitido | no admitido |
| validator.js isIdentityCard(x, "ES") 13.15.35 | no admitido | no admitido |
| validator.js isTaxID(x, "es-ES") 13.15.35 | no admitido | no 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.
Tamaño del bundle
Sección titulada «Tamaño del bundle»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.
| Librería | Cualquier tipo |
|---|---|
| @maistik/validate-nif 2.0.1 | |
| @kreyo/nif-validator 0.1.0 | |
| spain-id 1.1.14 | |
| dni-js 1.0.0 | |
| nif-dni-nie-cif-validation esta versión | |
| better-dni 4.4.2 | |
| jsvat 2.5.4 | |
| nif-dni-nie-cif-validation 1.0.11 | |
| validator.js isIdentityCard(x, "ES") 13.15.35 | |
| validator.js isTaxID(x, "es-ES") 13.15.35 | |
| stdnum 1.12.6 |
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.
| Librería | DNI | NIE | CIF | Cualquier tipo | Librería completa |
|---|---|---|---|---|---|
| @maistik/validate-nif 2.0.1 | 215 B | 243 B | 319 B | 456 B | 1189 B |
| @kreyo/nif-validator 0.1.0 | 533 B | 533 B | 533 B | 533 B | 746 B |
| spain-id 1.1.14 | 165 B | 237 B | 363 B | 583 B | 704 B |
| dni-js 1.0.0 | 883 B | 882 B | no admitido | 882 B | 880 B |
| nif-dni-nie-cif-validation esta versión | 623 B | 586 B | 568 B | 929 B | 4679 B |
| better-dni 4.4.2 | 1135 B | 1135 B | no admitido | 1134 B | 1132 B |
| jsvat 2.5.4 | 1186 B | 1186 B | 1186 B | 1186 B | 5266 B |
| nif-dni-nie-cif-validation 1.0.11 | 1517 B | 1517 B | 1518 B | 1517 B | 1514 B |
| validator.js isIdentityCard(x, "ES") 13.15.35 | 2539 B | 2539 B | no admitido | 2539 B | 44.449 B |
| validator.js isTaxID(x, "es-ES") 13.15.35 | 6537 B | 6537 B | no admitido | 6537 B | 44.449 B |
| stdnum 1.12.6 | 51.063 B | 51.063 B | 51.063 B | 51.063 B | 51.054 B |
Concordancia con SPEC.md
Sección titulada «Concordancia con SPEC.md»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.
| Librería | Todos los casos | Solo entrada canónica |
|---|---|---|
| nif-dni-nie-cif-validation esta versión | ||
| nif-dni-nie-cif-validation 1.0.11 | ||
| spain-id 1.1.14 | ||
| better-dni 4.4.2 | ||
| dni-js 1.0.0 | ||
| stdnum 1.12.6 | ||
| validator.js isIdentityCard(x, "ES") 13.15.35 | ||
| validator.js isTaxID(x, "es-ES") 13.15.35 | ||
| @maistik/validate-nif 2.0.1 | ||
| @kreyo/nif-validator 0.1.0 | ||
| jsvat 2.5.4 |
| Librería | DNI | NIE | CIF | K/L/M | Discrepancias | Por una decisión documentada |
|---|---|---|---|---|---|---|
| nif-dni-nie-cif-validation esta versión | 100,0 % | 100,0 % | 100,0 % | 100,0 % | 0 | 0 |
| nif-dni-nie-cif-validation 1.0.11 | 73,3 % | 88,9 % | 83,6 % | 100,0 % | 20 | 13 |
| spain-id 1.1.14 | 90,0 % | 77,8 % | 86,9 % | 36,4 % | 22 | 13 |
| better-dni 4.4.2 | 73,3 % | 77,8 % | no admitido | 45,5 % | 18 | 7 |
| dni-js 1.0.0 | 76,7 % | 77,8 % | no admitido | 45,5 % | 17 | 7 |
| stdnum 1.12.6 | 90,0 % | 83,3 % | 63,9 % | 100,0 % | 29 | 29 |
| validator.js isIdentityCard(x, "ES") 13.15.35 | 80,0 % | 77,8 % | no admitido | 45,5 % | 16 | 6 |
| validator.js isTaxID(x, "es-ES") 13.15.35 | 80,0 % | 77,8 % | no admitido | 100,0 % | 10 | 5 |
| @maistik/validate-nif 2.0.1 | 86,7 % | 77,8 % | 86,9 % | 45,5 % | 22 | 14 |
| @kreyo/nif-validator 0.1.0 | 86,7 % | 77,8 % | 86,9 % | 45,5 % | 22 | 14 |
| jsvat 2.5.4 | 90,0 % | 83,3 % | 82,0 % | 100,0 % | 17 | 17 |
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
ESfuera 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).
Ejecútalo tú mismo
Sección titulada «Ejecútalo tú mismo»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:
git clone https://github.com/josegoval/nif-dni-nie-cif-validation.gitcd nif-dni-nie-cif-validationpnpm install --frozen-lockfilepnpm bench:competitors # unos 5 minutos; escribe bench/results/latest.json y latest.mdpnpm 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.