Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Schema.isStringFinite (and Number string matching) takes quadratic time on long digit runs

Cerrado
#9,595 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@magoz ya está trabajando en esto.

Desde el 20/10/2026.

  • #9596 de @magoz — abierto

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
66/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
typescript
Área
backend

Línea de trabajo

The report identifies FINITE_PATTERN and the affected paths: Schema.isStringFinite(), number decoding, record keys, and template literals. Start by searching the schema implementation and tests for FINITE_PATTERN and the number string matching variants, then run the relevant tests with the reported long digit runs. Done when invalid inputs are rejected in linear time across the listed paths and existing number parsing behavior still passes.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

What version of Effect is running?

Current main (bbedfc71c0)

What steps can reproduce the bug?
import { Schema } from "effect"

const is = Schema.is(Schema.String.check(Schema.isStringFinite()))

for (const n of [5_000, 10_000, 20_000, 40_000]) {
  const input = "1".repeat(n) + "x"
  const start = performance.now()
  is(input) // false
  console.log(n, Math.round(performance.now() - start), "ms")
}
What is the expected behavior?

Rejecting the string takes time linear in its length (a few ms at 40k chars).

What do you see instead?

Quadratic time (Node v24.21.0): 12 ms, 47 ms, 163 ms, 751 ms. Each doubling of n makes it ~4× slower; 80k chars take ~2.8 s.

Additional information

The bare regex shows the same times, so the problem is FINITE_PATTERN ([+-]?\d*\.?\d+(?:[Ee][+-]?\d+)?): for a run of digits not followed by a valid ending, \d* and \d+ retry every split of the run.

/^[+-]?\d*\.?\d+(?:[Ee][+-]?\d+)?$/.test("1".repeat(40_000) + "x") // ~700 ms

The same regex (or its Infinity|-Infinity|NaN variant) runs in other places. Each was ~4× slower per doubling up to 40k chars:

Path 40k chars
Schema.isStringFinite() 729 ms
Schema.toCodecStringTree(Schema.Struct({ n: Schema.Number })) decoding { n: input } 640 ms
Schema.Record(Schema.Number, Schema.String) decoding { [input]: "v" } 491 ms
Schema.TemplateLiteral(["a", Schema.Number]) checking "a" + input 717 ms

Inputs that trigger it: "1".repeat(n) followed by "x", ".", "e" or ".1x", and the same with a leading -. "." + "1".repeat(n) + "x" and "1e" + "1".repeat(n) + "x" stay fast. Valid digit runs are fast too. Schema.NumberFromString does not use the regex and is not affected.

Lenguaje dominante
TypeScript
Estrellas
16.7k
Forks
808
Merge medio
10 h 7 min
PR fusionados (30 d)
808

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de Effect-TS/effect

Todos los issues de Effect-TS/effect

Issues similares

Más issues de TypeScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.