"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > هل التدفقات دائمًا أبطأ من المجموعات التقليدية في العمليات البسيطة؟

هل التدفقات دائمًا أبطأ من المجموعات التقليدية في العمليات البسيطة؟

تم النشر بتاريخ 2024-11-08
تصفح:925

Are Streams Always Slower Than Traditional Collections for Simple Operations?

Java 8 Stream Performance Vs. المجموعات التقليدية

لقد غامرت مؤخرًا في Java 8 وأجريت اختبارًا غير رسمي لمقارنة أداء Stream API الخاص بها مع المجموعات الكلاسيكية. يتضمن الاختبار الخاص بك تصفية قائمة من الأعداد الصحيحة، واستخراج الجذر التربيعي للأعداد الزوجية، وتخزين النتائج في قائمة مزدوجة. ومع ذلك، فأنت تشكك في صحة الاختبار الخاص بك وتتوق إلى توضيح الآثار المترتبة على الأداء الحقيقي.

تقييم الاختبار المعياري

نتائجك الأولية، التي أشارت إلى التدفقات أن تكون أبطأ من عمليات التحصيل، أثارت المخاوف. لضمان تقييم أكثر موثوقية، من الضروري معالجة الأخطاء المحتملة وإجراء اختبار عادل. فيما يلي بعض الاعتبارات:

  • استخدام LinkedList : LinkedList ليس الخيار الأمثل لقائمة النتائج لأنه يفتقر إلى الوصول العشوائي الفعال. فكر في استخدام ArrayList بدلاً من ذلك.
  • منهجية قياس الأداء: يمكن أن يكون قياس الأداء اليدوي عرضة لعدم الدقة. استخدم إطار قياس الأداء مثل JMH (Java Microbenchmarking Harness) لتوفير قياسات أكثر دقة وموثوقية.

نتائج المقارنة المعيارية المناسبة

باتباع هذه التوصيات، دعنا نعيد النظر في تقييم الأداء باستخدام JMH واستراتيجيات قياس الأداء المحسنة:

@OutputTimeUnit(TimeUnit.NANOSECONDS) @BenchmarkMode(Mode.AverageTime) @OperationsPerInvocation(StreamVsVanilla.N) الطبقة العامة StreamVsVanilla { int النهائي العام الثابت N = 10000؛ static List sourceList = new ArrayList(); ثابت { من أجل (int i = 0; i الفانيليا () { List result = new ArrayList(sourceList.size() / 2 1); لـ (عدد صحيح i: قائمة المصدر) { إذا (ط % 2 == 0){ result.add(Math.sqrt(i)); } } نتيجة الإرجاع؛ } @ المعيار قائمة عامة تيار () { إرجاع SourceList.stream() .filter(i -> i % 2 == 0) .map(الرياضيات::sqrt) .collect(Collectors.toCollection( () -> new ArrayList(sourceList.size() / 2 1))); }
@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)));
    }
}

النتائج: عينات الوضع المعياري تعني متوسط ​​وحدات الخطأ StreamVsVanilla.stream متوسط ​​10 17.588 0.230 ns/op StreamVsVanilla.vanilla avgt 10 10.796 0.063 ns/op

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

خلافًا للنتائج الأولية، يُظهر معيار JMH بوضوح أن نهج التجميع التقليدي أسرع بكثير من نهج التدفق في هذا السيناريو بالذات.

الاستنتاج

بناءً على نتائج المقارنة المرجعية المحسنة، يمكننا أن نستنتج أن:

التدفقات ليست كذلك أبطأ بطبيعتها من المجموعات. ومع ذلك، يمكن أن تفوق النفقات العامة الفوائد في حالات استخدام معينة، مثل عمليات التصفية ورسم الخرائط البسيطة.

توفر التدفقات مزايا كبيرة من حيث بساطة التعليمات البرمجية وقابلية الصيانة. إنها تعمل على تبسيط مسارات معالجة البيانات وتقليل التعليمات البرمجية النمطية.
  • بالنسبة لمسارات التعليمات البرمجية ذات الأداء الحرج، يُنصح دائمًا بإجراء قياس شامل ومراعاة المتطلبات المحددة لتطبيقك.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3