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

`Path` object creation and operations dominate CPU time on large resource trees

Abierto
#2,568 1 comentario 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
5/5
Tiempo estimado
Más de una semana
Aptitud para principiantes
30/100
Tipo de issue
Refactorización
Claridad
Necesita aclaración
Estado de actividad
Estancado
Stack tecnológico
java
Área
performance

Línea de trabajo

Comienza localizando el constructor Path(String), backslashToForward(), computeSegmentCount(), computeSegments(), equals() y Constants.RUNNING_ON_WINDOWS; en el issue no se nombra ningún archivo fuente ni ninguna prueba. Revisa los datos de heapdump enlazados y las API existentes de IPath.of() antes de elegir entre conversión específica de la plataforma, caching o cálculo diferido. Se considera terminado cuando se logra una reducción medida del tiempo de CPU relacionado con Path sin cambiar el comportamiento de las rutas.

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

Descripción

enhancement

During analysis of two heapdumps shared here the following issue was discovered as a hotspot that can benefit from optimization:

Performance Data
Metric WITH transitive WITHOUT transitive Ratio
Path.<init>() (µs) 24,933,686 12,598,757 2.0×
Path.computeSegmentCount() (µs) 12,651,521 3,382,879 3.7×
Path.append() (µs) 14,264,596 5,157,314 2.8×
Path.equals() (µs) 6,327,370 1,207,964 5.2×
StringLatin1.replace() (µs) 32,550,291 9,422,718 3.5×
Description

Path objects are created extensively throughout the JDT and Platform. The constructor calls backslashToForward() (which calls String.replace('\\', '/') — accounting for the StringLatin1.replace() overhead) and computeSegmentCount() (which scans the entire path string). The equals() method compares segments array-by-array.

With transitive dependencies, the number of classpath entries, package fragment roots, and resource lookups increases substantially, causing proportionally more Path creation and comparison. The 3.5× increase in StringLatin1.replace() (32.5 seconds total!) is particularly notable — this is pure overhead from the backslashToForward() conversion that happens in every Path constructor, even on Linux where no backslashes exist.

Suggested Fix
  1. Skip backslash conversion on non-Windows platforms: Path(String) unconditionally calls backslashToForward() which does path.replace('\\', '/'). Since this build is running on a specific OS, the conversion could be skipped when File.separatorChar == '/'. (Note: The source already has a forWindows parameter in the internal constructor, but the public Path(String) uses Constants.RUNNING_ON_WINDOWS. Verify this is correctly set.)
  2. Intern or cache frequently used paths: Classpath entry paths, project paths, and source folder paths are created repeatedly. An interning mechanism or flyweight pattern would reduce object creation.
  3. Lazy segment computation: computeSegments() and computeSegmentCount() are called in the constructor. If many Path objects are created only for equality checks or toString(), lazy computation would save work.
  4. Use IPath.of() factory method: If a canonical IPath.of() exists (or should be added), it could return cached instances for common paths.
Lenguaje dominante
Java
Estrellas
165
Forks
174
Merge medio
2 d 16 h
PR fusionados (30 d)
45

Preparar el entorno

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 eclipse-platform/eclipse.platform

Todos los issues de eclipse-platform/eclipse.platform

Issues similares

Más issues de Java

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.