SORU
21 Aralık 2012, Cuma


Nasıl bir özyinelemeli yöntem maksimum arama derinliğini tahmin etmek için?

Amaçlar için tahmini maksimum arama derinliği bir özyinelemeli yöntem yerine getirilmesi ile belirli bir miktarda bellek, ne (yaklaşık) formülü hesaplamak için kullanılan belleği önce bir stackoverflow hata ihtimali ortaya çıkar?

Düzenleme:

Birçok "" makul olan, izin önemsiz ama somut bir örnek kullanarak değişkenlerin bazılarını kaldırın . duruma göre değişir verdi

public static int sumOneToN(int n) {
    return n < 2 ? 1 : n   sumOneToN(n - 1);
}

Kolay Tutulması benim IDE bu çalışan n 1000 altında () benim için şaşırtıcı derecede düşük sadece patlar gösteriyor. Bu çağrı derinlik sınırı çalıştırmadan tahmin edebilir?

Edit: ben yardım edemem düşünce bu Tutulma bir sabit maksimum arama derinliği 1000, çünkü var 998 ama bir ana ve bir başlangıç aramak için yöntem, yapma 1000. Bu" bir numara bir tesadüf olmak için IMHO. "çok yuvarlak. Derinlemesine araştıracağım. Sadece havai-Xss vm parametre Dux var; yığın boyutu, Eclipse runner -Xss1000 bir yerde olması gerekir yani en fazla

CEVAP
21 Aralık 2012, Cuma


Bu açıkça JVM - mimarlık özgü belki de.

Aşağıdaki ölçtüm:

  static int i = 0;
  public static void rec0() {
      i  ;
      rec0();
  }

  public static void main(String[] args) {
      ...
      try {
          i = 0; rec0();
      } catch (StackOverflowError e) {
          System.out.println(i);
      }
      ...
  }

kullanarak

Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)

86 çalışan.

20 MB bir Java yığını (-Xss20m), itfa edilmiş maliyet ile arama başına 16-17 bayt dalgalanmıştır. Gördüğüm en düşük kare/16.15 bayt oldu. Ben bu nedenle maliyeti 16 bayt ve gerisi (sabit) diğer genel olduğu sonucuna varıldı.

int Bir tek götüren bir işlevi temelde/çerçeve bayt aynı maliyet, 16.

İlginçtir ki, on ints alan bir işlev 32 bayt çerçeve/gerektirir. Maliyeti bu kadar düşük ve neden emin değilim.

Yukarıdaki sonuçları kodundan sonra uygulamak JİT olarak hazırlanmıştır. Derlemeden önce kare başına maliyetçok, çokdaha yüksek. Henüz güvenilir bir şekilde tahmin etmek için bir yol çözemedim.Ancak, bu güvenilir bir özyinelemeli işlevi TAM zamanında derlenmiş olup olmadığını tahmin edebilirsiniz kadar güvenilir maksimum yineleme derinliğini tahmin etmek hiç umut var demek.

Bu 128K ve 8 ulimit bir yığın boyutları ile test edildi. Sonuçlar her iki durumda da aynıydı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Joe DiFeo

    Joe DiFeo

    7 AĞUSTOS 2012
  • Michael Zhang

    Michael Zhan

    8 EYLÜL 2012
  • UniqueApps

    UniqueApps

    4 Ocak 2009