"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Las transmisiones son siempre más lentas que las colecciones tradicionales para operaciones simples?

¿Las transmisiones son siempre más lentas que las colecciones tradicionales para operaciones simples?

Publicado el 2024-11-08
Navegar:513

Are Streams Always Slower Than Traditional Collections for Simple Operations?

Rendimiento de transmisión de Java 8 vs. Colecciones tradicionales

Recientemente se aventuró en Java 8 y realizó una prueba comparativa informal para comparar el rendimiento de su Stream API con las colecciones clásicas. Su prueba implica filtrar una lista de números enteros, extraer la raíz cuadrada de números pares y almacenar los resultados en una lista doble. Sin embargo, está cuestionando la validez de su prueba y está ansioso por aclarar las verdaderas implicaciones en el rendimiento.

Evaluación de la prueba comparativa

Sus resultados iniciales, que indicaban transmisiones ser más lento que las colecciones, generó preocupación. Para garantizar una evaluación más confiable, es esencial abordar los posibles errores y realizar una prueba justa. Aquí hay algunas consideraciones:

  • Uso de LinkedList: LinkedList no es una opción óptima para la lista de resultados ya que carece de acceso aleatorio eficiente. Considere usar ArrayList en su lugar.
  • Metodología de evaluación comparativa: la evaluación comparativa manual puede ser propensa a imprecisiones. Utilice un marco de evaluación comparativa como JMH (Java Microbenchmarking Harness) para proporcionar mediciones más precisas y confiables.

Resultados adecuados de evaluación comparativa

Siguiendo estas recomendaciones, revisemos el evaluación del desempeño utilizando JMH y estrategias de evaluación comparativa mejoradas:

@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
@OperationsPerInvocation(StreamVsVanilla.N)
public class StreamVsVanilla {
    public static final int N = 10000;

    static List sourceList = new ArrayList();
    static {
        for (int i = 0; i  vanilla() {
        List result = new ArrayList(sourceList.size() / 2   1);
        for (Integer i : sourceList) {
            if (i % 2 == 0){
                result.add(Math.sqrt(i));
            }
        }
        return result;
    }

    @Benchmark
    public List stream() {
        return sourceList.stream()
                .filter(i -> i % 2 == 0)
                .map(Math::sqrt)
                .collect(Collectors.toCollection(
                    () -> new ArrayList(sourceList.size() / 2   1)));
    }
}

Resultados:

Benchmark                   Mode   Samples         Mean   Mean error    Units
StreamVsVanilla.stream      avgt        10       17.588        0.230    ns/op
StreamVsVanilla.vanilla     avgt        10       10.796        0.063    ns/op

Resultados

Contrariamente a los resultados iniciales, el punto de referencia JMH muestra claramente que el enfoque de recopilación tradicional es significativamente más rápido que el enfoque de flujo en este escenario particular.

Conclusión

Con base en estos resultados mejorados de evaluación comparativa, podemos concluir que:

  • Los flujos no son inherentemente más lento que las colecciones. Sin embargo, sus gastos generales pueden superar los beneficios en ciertos casos de uso, como operaciones simples de filtrado y mapeo.
  • Los flujos ofrecen ventajas significativas en términos de simplicidad y mantenibilidad del código. Simplifican los procesos de procesamiento de datos y reducen el código repetitivo.
  • Para rutas de código críticas para el rendimiento, siempre es recomendable realizar evaluaciones comparativas exhaustivas y considerar los requisitos específicos de su aplicación.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3