Saltar al contingut

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.

On i com es va executar el benchmark
MàquinaAMD EPYC 9V74 80-Core Processor
Nuclis4
Memòria16 GiB
Sistema operatiulinux 6.17.0-1022-azure (x64)
Node.jsv24.21.0
Data2 d’octubre del 2026
Commit mesurat1166241
Mètode3 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.

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.

DNI: milions de validacions per segon (M ops/s; com més alta és la xifra, més ràpida és) amb 225 documents vàlids i no vàlids en forma canònica, i la proporció entre el rendiment d'aquesta versió i el de cada biblioteca
BibliotecaM ops/sRendiment relatiu
nif-dni-nie-cif-validation aquesta versió60,12—
@maistik/validate-nif 2.0.19,466,4× el rendiment
dni-js 1.0.08,906,8× el rendiment
nif-dni-nie-cif-validation 1.0.118,597,0× el rendiment
better-dni 4.4.28,447,1× el rendiment
spain-id 1.1.146,968,6× el rendiment
validator.js isIdentityCard(x, "ES") 13.15.355,7310,5× el rendiment
validator.js isTaxID(x, "es-ES") 13.15.354,2214,3× el rendiment
@kreyo/nif-validator 0.1.02,7821,6× el rendiment
jsvat 2.5.42,1028,6× el rendiment
stdnum 1.12.60,41146,3× el rendiment

Cap altra biblioteca no va ser més ràpida amb el conjunt DNI.

NIE: milions de validacions per segon (M ops/s; com més alta és la xifra, més ràpida és) amb 150 documents vàlids i no vàlids en forma canònica, i la proporció entre el rendiment d'aquesta versió i el de cada biblioteca
BibliotecaM ops/sRendiment relatiu
nif-dni-nie-cif-validation aquesta versió57,60—
@maistik/validate-nif 2.0.18,396,9× el rendiment
better-dni 4.4.28,177,1× el rendiment
nif-dni-nie-cif-validation 1.0.116,449,0× el rendiment
dni-js 1.0.04,4912,8× el rendiment
spain-id 1.1.144,0114,4× el rendiment
validator.js isTaxID(x, "es-ES") 13.15.353,4216,8× el rendiment
validator.js isIdentityCard(x, "ES") 13.15.353,1418,4× el rendiment
@kreyo/nif-validator 0.1.02,6521,7× el rendiment
jsvat 2.5.41,5936,2× el rendiment
stdnum 1.12.60,39146,0× el rendiment

Cap altra biblioteca no va ser més ràpida amb el conjunt NIE.

CIF: milions de validacions per segon (M ops/s; com més alta és la xifra, més ràpida és) amb 270 documents vàlids i no vàlids en forma canònica, i la proporció entre el rendiment d'aquesta versió i el de cada biblioteca
BibliotecaM ops/sRendiment relatiu
nif-dni-nie-cif-validation aquesta versió55,06—
@maistik/validate-nif 2.0.17,747,1× el rendiment
nif-dni-nie-cif-validation 1.0.117,277,6× el rendiment
spain-id 1.1.144,5012,2× el rendiment
@kreyo/nif-validator 0.1.02,5022,0× el rendiment
jsvat 2.5.42,3723,2× el rendiment
stdnum 1.12.60,38146,7× el rendiment
better-dni 4.4.2no admèsno admès
dni-js 1.0.0no admèsno admès
validator.js isIdentityCard(x, "ES") 13.15.35no admèsno admès
validator.js isTaxID(x, "es-ES") 13.15.35no admèsno 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.

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.

Mida d'un validador de qualsevol tipus (min+gzip; com més baixa és la xifra, més petit és)
BibliotecaQualsevol tipus
@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 aquesta versió929 B
better-dni 4.4.21.134 B
jsvat 2.5.41.186 B
nif-dni-nie-cif-validation 1.0.111.517 B
validator.js isIdentityCard(x, "ES") 13.15.352.539 B
validator.js isTaxID(x, "es-ES") 13.15.356.537 B
stdnum 1.12.651.063 B

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.

Mida d'un validador de cada tipus i de la biblioteca sencera (min+gzip; com més baixa és la xifra, més petit és)
BibliotecaDNINIECIFQualsevol tipusBiblioteca sencera
@maistik/validate-nif 2.0.1215 B243 B319 B456 B1.189 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 admès882 B880 B
nif-dni-nie-cif-validation aquesta versió623 B586 B568 B929 B4.679 B
better-dni 4.4.21.135 B1.135 Bno admès1.134 B1.132 B
jsvat 2.5.41.186 B1.186 B1.186 B1.186 B5.266 B
nif-dni-nie-cif-validation 1.0.111.517 B1.517 B1.518 B1.517 B1.514 B
validator.js isIdentityCard(x, "ES") 13.15.352.539 B2.539 Bno admès2.539 B44.449 B
validator.js isTaxID(x, "es-ES") 13.15.356.537 B6.537 Bno admès6.537 B44.449 B
stdnum 1.12.651.063 B51.063 B51.063 B51.063 B51.054 B

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.

Concordança amb SPEC.md (no correcció absoluta): el percentatge de casos que cada biblioteca jutja igual que SPEC.md, en tots els casos i, per separat, només en els casos amb entrada canònica
BibliotecaTots els casosNomés entrada canònica
nif-dni-nie-cif-validation aquesta versió100,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 %
Concordança amb SPEC.md per tipus de document, i les discrepàncies degudes a decisions que SPEC.md documenta
BibliotecaDNINIECIFK/L/MDiscrepànciesPer una decisió documentada
nif-dni-nie-cif-validation aquesta versió100,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 admès45,5 %187
dni-js 1.0.076,7 %77,8 %no admès45,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 admès45,5 %166
validator.js isTaxID(x, "es-ES") 13.15.3580,0 %77,8 %no admès100,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 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).

  • 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 ES fora 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).

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:

Finestra del 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 # uns 5 minuts; escriu bench/results/latest.json i latest.md

pnpm 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.