LINUX.ORG.RU

История изменений

Исправление quasimoto, (текущая версия) :

см. чуть выше

А как использовать? Если так:

void region()
{
    auto xs = dan_then_dog()();

    for (int i = 0; i < 1000000; ++i, xs = xs.tail())
        std::cout << xs.head << std::endl;
}

int main()
{
    region();
    for (int i = 0; i < 1000000; ++i)
        std::cout << "..." << std::endl;
    sleep(10);
}

то поведение как и у меня — линейно растёт память сотнями мегабайт, после выхода из region она не освобождается и висит до выхода из main.

Такой энергичный код

object Test {

  // Неохота писать нормальный тип, пусть будет Any.
  def f(a: Int, b: Int): (Int, Any) = (a, (_: Unit) => f(b, a))

  def test {
    var xs = f(1, 2)
    for (_ <- 1 to 10000000) {
      println(xs._1)
      xs = xs._2.asInstanceOf[Unit => (Int, Any)]()
    }
  }

}

вообще никак на кучу JVM не влияет.

Такой:

d :: [Int]
d = 1 : 2 : d

main = go 10000000 d where
  go 0 _ = return ()
  go n (x:xs) = print x >> go (n - 1) xs

работает в постоянных 2MB RSS (хотя это уже чит, так как тут настоящий ленивый конвейер и лямбды не у дел).

Исходная версия quasimoto, :

см. чуть выше

А как использовать? Если так:

void region()
{
    auto xs = dan_then_dog()();

    for (int i = 0; i < 1000000; ++i, xs = xs.tail())
        std::cout << xs.head << std::endl;
}

int main()
{
    region();
    for (int i = 0; i < 1000000; ++i)
        std::cout << "..." << std::endl;
    sleep(10);
}

то поведение как и у меня — линейно растёт память сотнями мегабайт, после выхода из region она не освобождается и висит до выхода из main.

Такой энергичный код

object Test {

  // Неохота писать нормальный тип, пусть будет Any.
  def f(a: Int, b: Int): (Int, Any) = (a, (_: Unit) => f(b, a))

  def test {
    var xs = f(1, 2)
    for (_ <- 1 to 10000000) {
      println(xs._1)
      xs = xs._2.asInstanceOf[Unit => (Int, Any)]()
    }
  }

}

вообще никак на кучу JVM не влияет.

Такой:

{-# LANGUAGE BangPatterns #-}

d :: [Int]
d = 1 : 2 : d

main = go 10000000 d where
  go 0 _ = return ()
  go !n (x:xs) = print x >> go (n - 1) xs

работает в постоянных 2MB RSS (хотя это уже чит, так как тут настоящий ленивый конвейер и лямбды не у дел).