سؤال

أود أن تحديد تسلسل بشكل متكرر على النحو التالي:

let rec startFrom x =
    seq {
        yield x;
        yield! startFrom (x + 1)
    }

أنا لست متأكدا مما إذا كان تسلسل متكررة مثل هذا ينبغي أن تستخدم في الممارسة العملية.على yield! يظهر أن يكون الذيل العودية, ولكن أنا لست متأكدا 100 ٪ منذ أن دعا من داخل آخر IEnumerable.من وجهة نظري التعليمات البرمجية بإنشاء مثيل من IEnumerable على كل مكالمة دون إغلاقه ، والتي من شأنها أن تجعل في الواقع هذه الدالة تسرب الذاكرة أيضا.

هذه الوظيفة تسرب الذاكرة ؟ لهذه المسألة هو أنه حتى "ذيل العودية"?

[تحرير لإضافة]:أنا التحسس حولها مع NProf عن إجابة, ولكن أعتقد أنه سيكون من المفيد الحصول على تفسير التقنية فيما يتعلق بتنفيذ تسلسل متكررة على ذلك.

هل كانت مفيدة؟

المحلول

أنا في العمل الآن لذلك أنا أبحث عن قليلا أحدث بت من Beta1, ولكن على بلدي مربع في وضع الإصدار ومن ثم النظر في التعليمات البرمجية المترجمة مع .صافي عاكس, ويبدو أن هاتين

let rec startFromA x =    
    seq {        
        yield x     
        yield! startFromA (x + 1)    
    }

let startFromB x =    
    let z = ref x
    seq {        
        while true do
            yield !z
            incr z
    }

توليد متطابقة تقريبا البرمجية MSIL عندما جمعت في 'الإصدار' واسطة.وأنها تعمل في نفس السرعة كما أن هذه التعليمات البرمجية C#:

public class CSharpExample
{
    public static IEnumerable<int> StartFrom(int x)
    {
        while (true)
        {
            yield return x;
            x++;
        }
    }
}

(مثلا ، ركضت جميع الإصدارات الثلاثة على بلدي مربع المطبوعة المليون النتيجة و كل نسخة استغرق حوالي 1.3 s, +/- 1s).(أنا لم افعل أي ذاكرة التنميط;من الممكن أنا في عداد المفقودين شيء مهم.)

باختصار لن العرق الكثير من التفكير حول قضايا مثل هذا إلا إذا كنت قياس أرى مشكلة.

تحرير

وأنا أدرك أنني لم أجب على السؤال...أعتقد أن الإجابة هي "لا, لا تسرب".(هناك شعور خاص في جميع 'بلا حدود' IEnumerables (مع المخبأة تخزين النسخ) 'تسرب' (اعتمادا على كيفية تعريف 'تسرب') ،

تجنب تجاوز سعة المكدس (مع F# لانهائية تسلسل تسلسل)

من أجل مناقشة مثيرة للاهتمام من IEnumerable (المعروف أيضا باسم 'يليها') مقابل LazyList و كيف يمكن للمستهلك بفارغ الصبر تستهلك LazyLists 'ننسى القديمة النتائج إلى منع نوع معين من 'تسرب'.)

نصائح أخرى

.صافي تطبيقات لا "تسرب الذاكرة" في هذا السبيل.حتى إذا كنت تقوم بإنشاء العديد من الكائنات القمامة جمع الإرادة الحرة أي الكائنات التي ليس لها جذور في التطبيق نفسه.

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

لن تسرب أي الذاكرة ، سوف تولد لا حصر له تسلسل ولكن منذ تسلسل IEnumerables يمكن تعداد لهم دون ذاكرة المخاوف.حقيقة أن العودية يحدث داخل تسلسل الجيل وظيفة لا تؤثر على سلامة العودية.فقط اعتبارنا أنه في وضع التصحيح ذيل استدعاء الأمثل قد يكون معطل من أجل السماح الكامل التصحيح, لكن في الإصدار لن يكون هناك مشكلة على الإطلاق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top