Was ist effzienter - Using, globale Variable?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Was ist effzienter - Using, globale Variable?

    Hallo.

    Und zwar wollte ich mal fragen, was effizienter ist.

    Beispiel folgende Funktion:

    VB.NET-Quellcode

    1. Public Function Req(Site As String, Met As String, Optional P As String = "") As String
    2. Dim Response As String = String.Empty
    3. Try
    4. Dim R As HttpWebRequest = CType(HttpWebRequest.Create(Site), HttpWebRequest)
    5. With R
    6. .Proxy = Nothing
    7. .Method = Met
    8. .CookieContainer = Containa
    9. .AllowAutoRedirect = True
    10. .UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"
    11. .ContentType = "application/x-www-form-urlencoded"
    12. .Timeout = 12000
    13. End With
    14. If Met = "POST" AndAlso P.Length > 4 Then
    15. R.ContentLength = P.Length
    16. Dim Wr As New StreamWriter(R.GetRequestStream(), System.Text.Encoding.Default)
    17. Wr.Write(P)
    18. Wr.Close()
    19. End If
    20. Dim Re As New StreamReader(R.GetResponse.GetResponseStream())
    21. Response = Re.ReadToEnd
    22. Re.Close()
    23. Catch
    24. End Try
    25. Return Response
    26. End Function


    Ist es da sinnvoller:

    VB.NET-Quellcode

    1. Using Wr As New StreamWriter(R.GetRequestStream(), System.Text.Encoding.Default)
    2. '..
    3. Using Re As New StreamReader(R.GetResponse.GetResponseStream())


    Oder sollte man Instanzen generell bei sowas eher global machen :

    VB.NET-Quellcode

    1. Private BlaBla As New Bla
    2. Private Sub Test()
    3. BlaBla.Method(...)
    4. End Sub



    Die Frage ist generell gestellt aber würde mich auch interessieren wie es aussieht,
    wenn man die Funktion beispielsweise 300.000x aufruft.

    Was ist sinnvoller?

    VB1963 schrieb:

    Ich glaube, mit Using wird es nicht schneller - aber man sollte es vorziehen...


    Okay, meine Frage bezog sich wie gesagt nicht nur auf einen Aspekt sondern ist generell gestellt.

    Dass der Request nicht schneller wird dadurch ist klar, denn der kann ja nicht schneller werden als das , was die
    Leitung an Leistung bringt.

    Wie sieht es mit der Ressourcenbelastung aus (RAM), Programmperformance etc.
    Ob du nun so machst:

    VB.NET-Quellcode

    1. Dim Re As New StreamReader(R.GetResponse.GetResponseStream())
    2. Response = Re.ReadToEnd
    3. Re.Close()
    oder

    VB.NET-Quellcode

    1. Using Re As New StreamReader(R.GetResponse.GetResponseStream())
    2. Response = Re.ReadToEnd
    3. End Using
    Ist performancetechnisch völlig wurst.
    Nur das Using ist klarer vonne Struktur her.
    Womit entschieden ist, was besser ist.

    Aber du solltest den TryCatch wegmachen, und ausserdem kannst du auch so machen:

    VB.NET-Quellcode

    1. Using Re As New StreamReader(R.GetResponse.GetResponseStream())
    2. return Re.ReadToEnd
    3. End Using


    Das alles hat mit globalen Variablen übrigens garnix zu tun - informiere dich mal, was eine globale Variable ist.

    ErfinderDesRades schrieb:


    Womit entschieden ist, was besser ist.

    Das alles hat mit globalen Variablen übrigens garnix zu tun - informiere dich mal, was eine globale Variable ist.



    Danke.

    Ich weiß was globale Variablen sind und weiß auch wofür sie gut sind - und
    m.E hat das schon was damit zu tun, ob man eine Funktion 300.000x aufruft
    und diese jedes mal ein Objekt mit Dim B As NEW BLABLA
    erstellt anstatt eine Instanz die man per globaler Variable nutzen kann, wo
    nur die Properties geändert werden möglicherweise.
    Das glaub ich nicht, dass du das weißt.
    Globale Variablen werden nämlich so gut wie nie verwendet.

    Um ein Objekt mehrmals zu verwenden braucht man keine globale Variable, da reicht eine private Klassen-Variable.

    Aber in deim Code-Beispiel ist das auch irrelevant - dort gibt es keine Alternative zu Methoden-lokalen Variablen, und hierbei ist die Using-Variante vorzuziehen.
    Da ein WebRequest nur für einen einzigen Abruf instanziert wird kannst du logisch auch keinen Stream erstellen, der mehrmals benutzt wird - weder zum Lesen noch zum Schreiben.

    Und natürlich wirst du die Methode deines Samples niemals 300000 mal aufrufen, denn wenn der WebRequest 2s braucht wären das bereits 600000 Sekunden, also 10000Minuten, also knapp 3,5 Tage.

    Daniel Baumert schrieb:

    sondern ist generell gestellt.
    Nimm Using und feddich.
    Das liest sich gut und ist absolut sauber.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!