Рекурсивные последовательности пропускают память?

Вы хотите использовать «noindex, follow» в метатеге роботов , а не robots.txt, потому что это позволит пропускать сок ссылок. Это лучше с точки зрения SEO.

10
задан Juliet 19 June 2009 в 20:46
поделиться

3 ответа

Я сейчас на работе, поэтому я смотрю на немного более новые биты, чем Beta1, но на моем ящике в режиме выпуска, а затем просматривая скомпилированный код с помощью .Net Reflector, кажется, что эти два

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 при компиляции в режиме Release. И они работают примерно с той же скоростью, что и этот код C #:

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

(например, я запустил все три версии на своем компьютере и распечатал миллионный результат, и каждая версия заняла около 1,3 с, +/- 1 с). (Я не занимался профилированием памяти; возможно, я упустил что-то важное.)

Короче говоря, я бы не стал слишком много думать о подобных проблемах, если вы не измеряете и не видите проблему.

EDIT

] Я понимаю, что на самом деле не ответил на вопрос ... Думаю, короткий ответ - «нет, утечки нет». (Есть особый смысл, в котором все

7
ответ дан 4 December 2019 в 04:21
поделиться

Приложения .NET не "утекают" память таким образом. Даже если вы создаете много объектов, сборка мусора освободит все объекты, не имеющие корней в самом приложении.

Утечки памяти в .NET обычно проявляются в виде неуправляемых ресурсов, которые вы используете в своем приложении (соединения с базой данных, потоки памяти и т. д.). Подобные случаи, когда вы создаете несколько объектов, а затем отказываетесь от них, не считаются утечкой памяти, поскольку сборщик мусора может освободить память.

-2
ответ дан 4 December 2019 в 04:21
поделиться

Никакой утечки памяти не будет, она просто сгенерирует бесконечную последовательность, но, поскольку последовательности являются IEnumerable, вы можете перечислить их без проблем с памятью. Тот факт, что рекурсия происходит внутри функции генерации последовательности, не влияет на безопасность рекурсии. Только учтите, что в режиме отладки оптимизацию хвостового вызова можно отключить, чтобы разрешить полную отладку, но в выпуске не будет никаких проблем.

-2
ответ дан 4 December 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: