Was ist von der Geschwindigkeit her besser?

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von EugenIS.

    Passt vielleicht nicht ganz zum Thema, aber da hier auch über Performance gesprochen wird, würde ich gerne mal Dapper in den Raum stellen. Dapper ist ein lightweight ORM mit einer super Performance bei maximaler Kontrolle, keine Blackbox wie EF. Anfang des Jahres habe ich mein erstes Projekt mit Dapper gestartet und würde freiwillig nichts mehr mit dem EF machen wollen. Das soll aber nur ein kleiner Einwurf am Rande sein, vielleicht ist es ja für wen interessant!?
    Gruß
    Christoph
    ​Passt vielleicht nicht ganz zum Thema, aber da hier auch über Performance gesprochen wird, würde ich gerne mal Dapper in den Raum stellen. Dapper ist ein lightweight ORM mit einer super Performance bei maximaler Kontrolle, keine Blackbox wie EF. Anfang des Jahres habe ich mein erstes Projekt mit Dapper gestartet und würde freiwillig nichts mehr mit dem EF machen wollen. Das soll aber nur ein kleiner Einwurf am Rande sein, vielleicht ist es ja für wen interessant!?


    Ich finde es sehr interessant... Bin immer für was neues offen. Zeig mal einen kleinen Beispiel...

    ​Gerne mach ich einen Test. Ich werde ihn allerdings mit EF Core machen.Versuche ich heute abend mal.


    Super! Freu mich drauf.

    ​Und das hast du auch Warm getestet, also mehr als nur 1 oder 2 mal nacheinander aufgerufen? Je nachdem was das EntityFramework so anstellt (ich tippe auf Reflection zu einem bestimmten Grad), kann ich mir bei einem einmaligen Aufruf von Funktionen etc. einen ziemlichen Overhead vorstellen, der bei weiteren Aufrufen unabhängig vom JIT dank Caching verschwindet.


    Mir ist bewusst, dass es sich um eine Datenbank handelt. Es können viele Faktoren eine Rolle mit spielen. Unter anderem auch die Datenbank selbst. Daher habe ich beim Testen es mit einer Schleife gemacht. Die ersten Male haben mich nicht wirklich interessiert. Weil diese meist immer sehr langsam sind, weil auch die Datenbank sich erstmal "schalten" muss...

    Wie dem auch sei, vielleicht hat sich es in letzter Zeit was getan. Es würde mich eigentlich freuen. Denn es war wirklich gutes Tool. Aber wenn er zu langsam ist, kann ich es für die meisten Maschinen einfach nicht einsetzten...
    Hallo

    Ich habe die ersten Tests schon gemacht. Stele ich heute mal Online.
    Was ich jetzt schon mal sagen kann.... es ist nicht der Rede wert. wir sind da Teilweise im µs Bereich was den Unterschied in der Performance betrifft.

    Aus erfahrung (ich beschäftige mich seit ca. 3 Jahren mit EF) weis ich das zu 90% eine falsche Verwendung des Frameworks zu schlechter Performance führt.
    Werde aber noch ein paar meht Tests einspielen damit es auch representativ wird.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    EF Core Performance Tests

    Also, ich habe mal die Tests gemacht. Jeder Test läuft immer in etwa mit 100 Durchläufen. So wie ich das sehe gibt es keinen Grund mit ExecuteSQLCommand oder mit FromSql zu Arbeiten.
    Oft ist EF Core auf die "normale" Art sogar schneller als über FromSql und beim Update sowieso da EF Core Batching unterstützt.
    Wie schon erwähnt, bei richtiger Anwendung ist EF Core nicht schlecht. Und dort wo es langsamer ist gehts auch nur um Millisekunden.

    Eure Meinung???










    Anbei auch die Consolenanwendung. Es muss einmal ein Rebuild durchgeführt werden damit die NuGet-Pakete geladen werden.

    EugenIS schrieb:

    Wobei wir gerade dabei sind. Wie hälst du eigentlich die Daten aktuell, wenn es mehrere Rechner auf die DB zugreifen können und die Daten beschreiben können?

    Das musst du genauer erklären, wo soll es da Probleme geben? Genau das ist das Einsatzgebiet einer Datenbank. Genau hier hat sie ihre stärke. Bitte schreib mal was du machen willst und wo du denkst das du Schwierigkeiten bekommen würdest, denn selbst beim Fall der "gleichzeitigen" Bearbeitung eines Datensatzes gibt es Möglichkeiten welche auch EF OutOfTheBox unterstützt.


    Schöne Grüße allen
    Sascha
    Dateien
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nein, das habe ich nicht gemeint...

    Was ich gemeint habe steht da auch. Wie hälst du mehrere Rechner auf einem aktuellem Stand? Angenommen du hast Tabelle auf die Rechner A und B was drauf schreiben können. Wie machst du das, dass der Rechner B es mit bekommt, dass die Tabelle sich geändert hat, wenn der Rechner A daran was ändert... Hast du einen guten Ansatz für?
    Eine Version Spalte welche bei jeder Änderung inkrementiert wird.


    In dem Fall muss man ja ständig polling betreiben...


    @Nofear23m Ich habe mir den Test angesehen. Also ich bin jetzt nicht so fit in vb. Dennoch läuft es irgend wie nicht bei mir. Sie auf Bildern. Daher kann ich zu den Zeiten überhaupt nichts sagen. Ich habe dir Bilder hoch geladen, kannst dir ansehen.

    Bei dem ExecuteSqlCommand habe ich aus Erfahrung festgestellt, dass wenn du was in '' nimmst, wird es noch einmal irgend wie umformatiert, sodass es große Geschwindigkeitsnachteile mit sich bringt. Warum das so ist, weiß ich selbst nicht so genau. Jedenfalls kannst du es selbst ausprobieren einen Unterschied zwischen:
    ctx.Database.ExecuteSqlCommand("UPDATE dbo.Person SET Zip = '99999' WHERE Id >= 1000 And Id < 2000")
    ctx.Database.ExecuteSqlCommand("UPDATE dbo.Person SET Zip = {0} WHERE Id >= 1000 And Id < 2000", "99999")
    zu finden. (Ich meine zeitlichen Unterschied) Selbst Texte werden ohne Hochkoma als Parameter mitgegeben und werden nicht noch einmal umformatiert...
    Bilder
    • Unbenannt.PNG

      45,56 kB, 979×512, 78 mal angesehen
    • Unbenannt1.PNG

      118,98 kB, 1.936×1.058, 79 mal angesehen
    • Unbenannt2.PNG

      11,09 kB, 991×125, 74 mal angesehen
    @EugenIS

    Steht dort dort warum der Test nicht ausgeführt wird. Hast du die Fehlermeldung im ersten Bild überhaupt gelesen? Ernsthaft? Du musst es im Release kompilieren und OHNE Debugger ausführen. Sonst bekommst du ja auch keine representativen Werte heraus wenn der Debugger mit drinnen hängt.
    zu dem zweiten Bild. Verwende entweder String.Format oder die String-Interpolation. (Siehe ca. 50 Beispiele innerhalb des Projekts)

    EugenIS schrieb:

    Jedenfalls kannst du es selbst ausprobieren einen Unterschied zwischen:
    ctx.Database.ExecuteSqlCommand("UPDATE dbo.Person SET Zip = '99999' WHERE Id >= 1000 And Id < 2000")
    ctx.Database.ExecuteSqlCommand("UPDATE dbo.Person SET Zip = {0} WHERE Id >= 1000 And Id < 2000", "99999")


    Ändert bei mir nichts. Aber egal. Du scheinst wohl eh Beratungsresistent zu sein. Es geht hier um wenige Millisekunden, egal wie man es dreht oder wendet. Du verwendest ein Framework so dermaßen falsch das du die vorteile dieses Framework erst gar nicht erhälst, warum es also verwenden? Ist doch völlig unsinnig. Wenn du meinst es ist dir zu langsam dann regel doch gleich alles über ADO.Net.
    Wie @ErfinderDesRades schon geschrieben hat, der wohl größte Vorteil ist das man Intellisense und Compilerprüfung für Abfragen über LinqToEntities hat und dann nutzt man es nicht? Zeitverschwendung oder? Naja.

    Ich sehe ein das wenn es jemanden wirklich um Performance geht und wir hier zb. in wenigen Millisekunden reagieren müssen weil z.b. auf einem Fliesband Waren vorbeilaufen welche gescannt und in eine DB eingetragen werden müssen das man hier versucht was rauszuholen. Aber wenn dem so ist verwende ich keinen O/R Mapper.

    Wegen deinem "aktualitätsprojekt".
    Wenn es dir darum geht das jeder Rechner SOFORT die änderung mitbekommt (wobei Erfahrungen zeigen das dies wirklich sehr selten notwendig ist) dann hat das in erster Linie jetzt mal wenig mit der Datenbank zu tun. du musst einfach dafür sorgen das alle Clients mitbekommen das sich was geändert hat und sie bitte aktualisieren sollen. Ich habe sowas bereits öfters gelöst, was meiner Meinung nach sehr gut über Remoting funzt. Das sollte dir als Stichwort genügen denke ich.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    ​Du scheinst wohl eh Beratungsresistent zu sein.


    Nun ja, ich finde wenn du nicht in der Lage bist, mich von dem EF zu überzeugen muss du nicht herablassend werden. Hab hier was zur Diskussion gestellt um eben sich beraten zu lassen. Daher hör auf über mich zu urteilen! Zum einem hast du überhaupt kein Grund für. Zum anderen wer gibt dir dazu bitte das Recht? Bist du plötzlich zum Richter aufgestiegen?

    ​Steht dort dort warum der Test nicht ausgeführt wird. Hast du die Fehlermeldung im ersten Bild überhaupt gelesen? Ernsthaft? Du musst es im Release kompilieren und OHNE Debugger ausführen. Sonst bekommst du ja auch keine representativen Werte heraus wenn der Debugger mit drinnen hängt.


    Ja ich habe es gelesen! Und es wird dich vielleicht wundern, aber ich habe es auch in der Tat auf Release umgestellt. Aber dann wollte er so garnicht und alles wurde rot.

    ​Ich sehe ein das wenn es jemanden wirklich um Performance geht und wir hier zb. in wenigen Millisekunden reagieren müssen weil z.b. auf einem Fliesband Waren vorbeilaufen welche gescannt und in eine DB eingetragen werden müssen das man hier versucht was rauszuholen. Aber wenn dem so ist verwende ich keinen O/R Mapper.


    Genau das meinte ich. Mir geht es eben um jede milli-Sekunde.

    Und bevor du weiterhin so tust, als hättest du die Welt verstanden und uns alle hier locker wegstecken kannst könnte ich dir mal ein Echtzeitsystem zeigen, wo es eben um jede nano-Sekunde geht. Das habe ich seiner Zeit im Jahre 2010 geschrieben in VB.Net... Schon mal Piano auf einem Hydropuls-Kolben gehört? Hier, habe ich selbst geschrieben. Mach das mal nach:
    Und bevor du dir einbildest, dass es dort nur um die Oberfläche ging, muss ich dich enttuschen. Der Hydraulik-Zylinder wird auch von mir geregelt. Da sind mehrere Regler drin. Unter anderem ein "Amplituden und Offsetregler". Wobei es sich um einen kleinen Projekt handelt.

    Du hast sicherlich was studiert, und wirst nicht abstreiten können, dass die Realität sich meist von Praxis ein wenig unterscheidet. Ich spreche von Datenbanken mit 100 Benutzern gleichzeitig und Tabellen von bis zu 10.000.000 Datensätzen. Daher ist es ein Unterschied in einer perfekten Umgebung ein youtube Video zu drehen mit 20.000 Datensätzen und einer Fabrik wo du ein Farad brauchst um von a nach b zu kommen. Daher komm mal wieder runter wenn du mit reden willst. Oder lass es einfach sein. Lass uns "den Pöbel" unter sich diskutieren...
    Was soll ich dazu nur noch weiter sagen. Ich habe nichts Studiert und mir alles selbst beigebracht. Auch ich arbeite in einem großen Konzern und meine Programme laufen auch auf sehr vielen Rechnern, aber ich muss mich hier nicht rechtfertigen. Und eines: Ich muss dir nichts nachmachen, will ich auch nicht. Ich muss dir nichts beweisen, wirklich nicht. Auch muss ich dir nicht EF "schmackhaft" machen. DU verwendest es für etwas wo es nicht hingehört, nicht ich.

    Ich bin raus hier. Das muss ich mir nicht geben wenn ich in meiner Freizeit versuche zu helfen.

    Thema für mich erledigt, ich habe die Tests geliefert und diese lügen auch nicht. Punkt.

    Tschüss
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Achso. Hast dir Ahnung abgelesen. Freut mich. Und bevor jemand mir ein Post stellt, dass ich drüber urteile, NEIN! Ich hab schon studierte Idioten gesehen und hervorragende selbst-Lerner.

    Ich habe auch nicht verlangt, dass du mir was beweist. Ein wenig mehr Respekt in deinen Post. Sieht scheiße aus wie du es machst... Wir wollen von deinem Wissen profitieren und sich nicht beurteilen! Daher bist du in meinen Themen scheinbar falsch. Dennoch freut es mich, dass du mich endlich in ruhe hier was posten lässt. Bis dato habe ich nicht einmal bei einer Problemstellung von Dir was vernümftiges gesehen. Alles nur Gemäcker und irgend welche sinnlose Beurteilung.