Rendiment
Com és de ràpida i de petita aquesta biblioteca, al costat de la seva versió principal anterior i de les altres biblioteques d’npm que validen identificadors espanyols. Totes les xifres d’aquesta pàgina es llegeixen de bench/results/latest.json en generar el lloc web: no s’escriu res a mà. Si una biblioteca és més ràpida o més petita en alguna cosa, les taules ho mostren.
| Màquina | AMD EPYC 9V74 80-Core Processor |
|---|---|
| Nuclis | 4 |
| Memòria | 16 GiB |
| Sistema operatiu | linux 6.17.0-1022-azure (x64) |
| Node.js | v24.21.0 |
| Data | 2 d’octubre del 2026 |
| Commit mesurat | 1166241 |
| Mètode | 3 rondes; cada tasca, 2.000 ms després de 500 ms d'escalfament, en el seu propi procés; la xifra correspon a la mediana dels resultats de les rondes |
Les xifres absolutes depenen de la màquina. Les proporcions entre les biblioteques d’una mateixa execució es mantenen molt millor d’una màquina a una altra, de manera que compareu aquestes.
Velocitat
Secció titulada «Velocitat»Milions de validacions per segon (M ops/s; com més alta és la xifra, més ràpida és), amb cada biblioteca cridada com indica la seva documentació, amb les opcions per defecte, sobre els mateixos documents vàlids i no vàlids en forma canònica. «Rendiment relatiu» indica la proporció entre el rendiment d’aquesta versió i el de cada biblioteca, en la mateixa execució. no admès vol dir que la biblioteca no té validador per a aquest tipus.
| Biblioteca | M ops/s | Rendiment relatiu |
|---|---|---|
| nif-dni-nie-cif-validation aquesta versió | — | |
| @maistik/validate-nif 2.0.1 | 6,4× el rendiment | |
| dni-js 1.0.0 | 6,8× el rendiment | |
| nif-dni-nie-cif-validation 1.0.11 | 7,0× el rendiment | |
| better-dni 4.4.2 | 7,1× el rendiment | |
| spain-id 1.1.14 | 8,6× el rendiment | |
| validator.js isIdentityCard(x, "ES") 13.15.35 | 10,5× el rendiment | |
| validator.js isTaxID(x, "es-ES") 13.15.35 | 14,3× el rendiment | |
| @kreyo/nif-validator 0.1.0 | 21,6× el rendiment | |
| jsvat 2.5.4 | 28,6× el rendiment | |
| stdnum 1.12.6 | 146,3× el rendiment |
Cap altra biblioteca no va ser més ràpida amb el conjunt DNI.
| Biblioteca | M ops/s | Rendiment relatiu |
|---|---|---|
| nif-dni-nie-cif-validation aquesta versió | — | |
| @maistik/validate-nif 2.0.1 | 6,9× el rendiment | |
| better-dni 4.4.2 | 7,1× el rendiment | |
| nif-dni-nie-cif-validation 1.0.11 | 9,0× el rendiment | |
| dni-js 1.0.0 | 12,8× el rendiment | |
| spain-id 1.1.14 | 14,4× el rendiment | |
| validator.js isTaxID(x, "es-ES") 13.15.35 | 16,8× el rendiment | |
| validator.js isIdentityCard(x, "ES") 13.15.35 | 18,4× el rendiment | |
| @kreyo/nif-validator 0.1.0 | 21,7× el rendiment | |
| jsvat 2.5.4 | 36,2× el rendiment | |
| stdnum 1.12.6 | 146,0× el rendiment |
Cap altra biblioteca no va ser més ràpida amb el conjunt NIE.
| Biblioteca | M ops/s | Rendiment relatiu |
|---|---|---|
| nif-dni-nie-cif-validation aquesta versió | — | |
| @maistik/validate-nif 2.0.1 | 7,1× el rendiment | |
| nif-dni-nie-cif-validation 1.0.11 | 7,6× el rendiment | |
| spain-id 1.1.14 | 12,2× el rendiment | |
| @kreyo/nif-validator 0.1.0 | 22,0× el rendiment | |
| jsvat 2.5.4 | 23,2× el rendiment | |
| stdnum 1.12.6 | 146,7× el rendiment | |
| better-dni 4.4.2 | no admès | no admès |
| dni-js 1.0.0 | no admès | no admès |
| validator.js isIdentityCard(x, "ES") 13.15.35 | no admès | no admès |
| validator.js isTaxID(x, "es-ES") 13.15.35 | no admès | no admès |
Cap altra biblioteca no va ser més ràpida amb el conjunt CIF.
La velocitat no ho és tot, i aquestes xifres deixen coses fora: la memòria, la primera crida abans que el JIT s’escalfi, l’entrada que necessita normalització i el cost del resultat detallat de validate(). Una biblioteca que rebutja aviat una cadena és ràpida amb aquesta cadena, i per això la concordança amb SPEC.md es mesura a part, més avall.
Mida del bundle
Secció titulada «Mida del bundle»El que afegeix un validador a un bundle, minificat i comprimit amb gzip (min+gzip; com més baixa és la xifra, més petita és), empaquetat amb esbuild com fa la comprovació de mida de la mateixa biblioteca. La barra d’una biblioteca molt més gran que les altres es dibuixa sencera, amb el final tallat.
| Biblioteca | Qualsevol tipus |
|---|---|
| @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 aquesta versió | |
| 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 petites que aquesta versió per a un validador de qualsevol tipus: @maistik/validate-nif 2.0.1 (456 B), @kreyo/nif-validator 0.1.0 (533 B), spain-id 1.1.14 (583 B) i dni-js 1.0.0 (882 B). També s'ha mesurat stdnum 1.12.6 amb una importació directa del seu mòdul del NIF espanyol (no documentada): 2.468 B.
Algunes biblioteques més petites validen menys tipus. Aquesta dedica bytes a normalitzar l’entrada, als tipus de control de CIF-3 i als NIF K/L/M. Les biblioteques publicades només com a CommonJS no admeten tree shaking, de manera que una de les seves funcions costa la biblioteca sencera. Les biblioteques de molts països o de propòsit general, com stdnum i validator.js, són més grans per disseny.
| Biblioteca | DNI | NIE | CIF | Qualsevol tipus | Biblioteca sencera |
|---|---|---|---|---|---|
| @maistik/validate-nif 2.0.1 | 215 B | 243 B | 319 B | 456 B | 1.189 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 admès | 882 B | 880 B |
| nif-dni-nie-cif-validation aquesta versió | 623 B | 586 B | 568 B | 929 B | 4.679 B |
| better-dni 4.4.2 | 1.135 B | 1.135 B | no admès | 1.134 B | 1.132 B |
| jsvat 2.5.4 | 1.186 B | 1.186 B | 1.186 B | 1.186 B | 5.266 B |
| nif-dni-nie-cif-validation 1.0.11 | 1.517 B | 1.517 B | 1.518 B | 1.517 B | 1.514 B |
| validator.js isIdentityCard(x, "ES") 13.15.35 | 2.539 B | 2.539 B | no admès | 2.539 B | 44.449 B |
| validator.js isTaxID(x, "es-ES") 13.15.35 | 6.537 B | 6.537 B | no admès | 6.537 B | 44.449 B |
| stdnum 1.12.6 | 51.063 B | 51.063 B | 51.063 B | 51.063 B | 51.054 B |
Concordança amb SPEC.md
Secció titulada «Concordança amb SPEC.md»El percentatge dels casos de prova de la biblioteca (opcions per defecte) que cada biblioteca jutja igual que SPEC.md: vàlids o no vàlids.
| Biblioteca | Tots els casos | Només entrada canònica |
|---|---|---|
| nif-dni-nie-cif-validation aquesta versió | ||
| 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 |
| Biblioteca | DNI | NIE | CIF | K/L/M | Discrepàncies | Per una decisió documentada |
|---|---|---|---|---|---|---|
| nif-dni-nie-cif-validation aquesta versió | 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 admès | 45,5 % | 18 | 7 |
| dni-js 1.0.0 | 76,7 % | 77,8 % | no admès | 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 admès | 45,5 % | 16 | 6 |
| validator.js isTaxID(x, "es-ES") 13.15.35 | 80,0 % | 77,8 % | no admès | 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 tipus que una biblioteca no valida s’exclou de les seves xifres, de manera que compareu les columnes, i no «Tots els casos», entre biblioteques d’abast diferent. La llista de discrepàncies de cada biblioteca, amb un exemple de cadascuna, és a latest.md (en anglès).
Mètode
Secció titulada «Mètode»- Entrades. Es generen amb un generador pseudoaleatori amb llavor, de manera que totes les execucions i totes les màquines mesuren les mateixes cadenes: documents vàlids i els mateixos documents amb un caràcter de control incorrecte, per a cada tipus.
- Crides. Cada biblioteca es crida exactament com indica la seva documentació, amb les opcions per defecte, sobre la cadena d’entrada sense processar. L’única excepció és jsvat, un validador de NIF-IVA, a les entrades del qual s’afegeix el prefix
ESfora del bucle cronometrat. - Mesura. tinybench executa cada tasca en el seu propi procés, després d’un escalfament, perquè el que V8 aprèn d’una biblioteca no canviï la xifra de la següent. L’execució completa es repeteix en diverses rondes, l’ordre de les biblioteques va rotant entre conjunts i rondes, i cada xifra correspon a la mediana dels resultats de les rondes.
- Mida. La importació d’una sola funció que documenta cada biblioteca, empaquetada i minificada amb esbuild i comprimida amb gzip al nivell 9, menys el cost d’una importació buida.
- Concordança. La crida «qualsevol tipus» de cada biblioteca sobre els casos que proven les opcions per defecte, jutjant cada cas com a vàlid o no vàlid.
La metodologia completa, les seves advertències i l’esquema dels resultats són a bench/README.md (en anglès).
Executeu-lo vosaltres mateixos
Secció titulada «Executeu-lo vosaltres mateixos»Les biblioteques s’instal·len en versions exactes, de manera que una execució mesura exactament el que recull latest.json. Tanqueu abans els altres programes, i compareu proporcions en lloc de xifres absolutes:
git clone https://github.com/josegoval/nif-dni-nie-cif-validation.gitcd nif-dni-nie-cif-validationpnpm install --frozen-lockfilepnpm bench:competitors # uns 5 minuts; escriu bench/results/latest.json i latest.mdpnpm bench, en canvi, compara cada validador amb la versió 1. Un flux de treball de GitHub Actions executa el mateix benchmark a demanda, en un runner compartit, i en penja els resultats.