2016-04-04 14 views
2

ich diesen Code renne:Rekursion Beschleunigung nach 10.000

public static void func(int i) 
{    
     Console.WriteLine(i); 
     func(i + 1); 
} 

static void Main(string[] args) 
{ 
    func(0); 
} 

offensichtlich verursacht es Stackoverflow, aber etwas seltsam passiert: Von i = 0 bis i = 10.000 es läuft ziemlich langsam, (ca. 13 Sekunden auf meinem Computer, mit Visual Studio 2015), aber von 10.000 bis 20.000 ist es fast sofort (ca. 1 Sekunde). Warum passiert das?

Danke.

+0

Im Debug-Modus oder optimierte Version? –

+1

Wie messen/beobachten Sie das? –

+4

Haben Sie die Puffergröße Ihres Konsolenfensters auf 10.000 Zeilen festgelegt? Die WriteLine ist der langsamste Teil in Ihrem Code. –

Antwort

0

Haben Sie die Puffergröße Ihres Konsolenfensters auf 10.000 Zeilen festgelegt? Die WriteLine ist der langsamste Teil in Ihrem Code. Das Konsolenfenster scheint schneller zu sein, sobald es die maximale Anzahl von Zeilen erreicht hat.

0

Vielleicht gibt es etwas über die Visual Studio-Konfiguration oder etwas, das für Ihren Computer spezifisch ist. Wenn ich Ihren Code in Release-Konfiguration ausführe, wird er innerhalb von 3 Millisekunden ausgeführt. Im Debug-Modus das "i" geht nie 9000 ...

class Program 
    { 
     public static void func(int i) 
     { 
      if (i % 1000 == 0) 
       Console.WriteLine(DateTime.Now.ToString("HH:mm:ss:ff") + " => i : " + i.ToString()); 
      func(i + 1); 
     } 

     static void Main(string[] args) 
     { 
      func(0); 
      Console.Read(); 
     } 
    } 

enter image description here

+0

Das ist, weil Sie den teuersten Teil des Codes vermieden haben - die häufige 'Console.WriteLine'. Was den unteren Rekursionsbetrag betrifft, würde ich "64-Bit" erraten - die Stack-Größe ist immer noch dieselbe, aber jeder "Push" bedeutet 64-Bit statt 32-Bit. Das ist nur eine wilde Vermutung - es gibt viele andere Dinge, die das beeinflussen können. – Luaan

+0

Ja Luaan, du hast Recht! fügt hinzu, dass es eine Maschine ist, die in Core-i-5 und anderen "nicht schlechten" Teilen läuft: D –

0

lief ich dieses Stück Code in Online-C# Compiler tutorialspoint:

using System.IO; 
using System; 
using System.Diagnostics; 

class Program 
{ 
    static Stopwatch stopwatch = new Stopwatch(); 
    static TextWriter tw = new StreamWriter("Result.txt"); 

    public static void func(int i) 
    { 

     if (i > 40000) 
      return; 

     tw.WriteLine(stopwatch.ElapsedMilliseconds + " " + i); 
     tw.Flush(); 
     func(i + 1); 
    } 

    static void Main(string[] args) 
    { 
     stopwatch.Start(); 
     func(0); 
     stopwatch.Stop(); 
     tw.Close(); 
    } 
} 

Das Ergebnis was ich habe ist die this

Wie Sie sehen können, gibt es ein paar Sprünge in der Zeit, speziell bei 20461 und 20548. Ich weiß nicht, was ich davon machen soll ...