Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Http Get (aber bitte schnell) (https://www.delphipraxis.net/180424-http-get-aber-bitte-schnell.html)

cherry 19. Mai 2014 14:52

Http Get (aber bitte schnell)
 
Hallo zusammen

Ich bin hier allmälich am verzweifeln. Ich muss mit Delphi7 auf einen C# WCF Webservice zugreifen. Im Vordergrund steht hier vor allem die Geschwindigkeit. Deshalb bin ich überall am sparen wos nur geht. Ich hab verschiedene Tests gemacht sowohl mit SOAP wie auch mit REST. Kurz und Knapp : Der Webservice hat eine Funktion Find(..) als Rückgabe werden verschiedene IDs erwartet.

Ich bevorzuge hier eigentlich REST um den Overhead möglichst gering zu halten. Mittels TIdHttp Komponente setze ich folgendes GET ab: "http://localhost:8080/Web/Find?text=blablabla". Ich hab den Prototyp so eingestellt, dass mir jeweils die ersten 1000 gefundenen IDs zurückgegeben werden. Die IDs werden als Komma separierten ASCII String zurückgegeben. Das ganze funktioniert eigentlich soweit ganz gut. Nur habe ich so meine Bedenken was die Geschwindigkeit angeht. Bei dieser Variante schwanken die Antwortzeiten ganz schön...

Die Suche ist immer dieselbe der Server hat jeweils ca. 644ms Sekunde um die Suche abzuarbeiten, der Rest ist eigentlich der Kommunikationsaufwand, welchen ich möglichst gering halten möchte...

(Antwortzeiten in ms)
1279, 1264, 671, 1263, 671, 1279, 671, 671, 670, 671

Dasselbe habe ich nun noch mit SOAP gemacht (RPC Encoded) und gibt mir folgende Zeiten
(Antwortzeiten in ms)
811, 811, 780, 780, 749, 749, 733, 749, 734, 733

Eigentlich habe ich erwartet, dass die REST Variante schneller ist. Wenn ich den Client auch mit C# schreibe, dann sind beide Varianten ungefähr gleich schnell. REST ein kleines bisschen schneller. Das müsste sich ja bei DELPHI genau so verhalten? Wenn ich die REST URL im Browser eingebe dauert es nie länger 656ms.

Warum schwankt TIdHttp.Get() so stark ? -> Irgendwie habe ich das Dumpfe Gefühl, dass es an der Komponente liegt. Hab deshalb auf Indy 9.0.18 geupdatet, was leider auch nichts gebracht hat. Des weiteren habe ich die synopsis Komponenten mit der Funktion HttpGetText getestet. Die war leider auch nicht schneller und wies ähnliche Schwankungen auf. (Was eigentlich gegen meine Vermutung spricht).

Da ist was faul... aber was? - Es kann ja nicht sein, dass SOAP hier schneller ist. Es müsste mindestens gleich schnell sein. Bauchweh machen mir vorallem die starken Schwankungen. Machmal dauert es einfach doppelt solange wie sonst...

Hat jemand eine Idee was ich noch versuchen kann, oder wo das Problem liegen könnte ?

Liebe Grüsse
& Danke im Voraus

Sir Rufo 19. Mai 2014 15:12

AW: Http Get (aber bitte schnell)
 
Nur mal so am Rande:

Warum ein Update auf Indy 9.x und nicht auf 10.x? :gruebel:

mjustin 19. Mai 2014 15:19

AW: Http Get (aber bitte schnell)
 
Eventuell läßt sich das anhand eines minimalen WCF Projekts reproduzieren, das hier gepostet werden kann? Dann könnte man verschiedene HTTP Clients testen (Indy 10.6, Apache Bench, JMeter).

Zitat:

Zitat von cherry (Beitrag 1259377)
Wenn ich die REST URL im Browser eingebe dauert es nie länger 656ms.

Wie wird die Zeit gemessen, ist das nur die Zeit für das Auslesen der HTTP Response? Oder für Request und Response?

cherry 19. Mai 2014 15:48

AW: Http Get (aber bitte schnell)
 
Hallo zusammen

@Rufo: Wenn ich ehrlich bin, hab ichs kurz versucht zu installieren. Da es nicht auf Anhieb geklappt hat und die Version mit "Work in progress" (bzw. nicht Stable) gekennzeichnet ist hab ichs dann auch nicht weiter versucht.

@mjustin: Eine minimale Anwendung kann ich gerne machen und posten... Bezüglich der Zeitangabe: Ich habe dazu die Chrome App "Advanced Rest Client" verwendet. Die Zeitangabe beinhaltet Request und Response
(und vermutlich sogar die Darstellung der IDs)

mjustin 19. Mai 2014 16:02

AW: Http Get (aber bitte schnell)
 
Zitat:

Zitat von cherry (Beitrag 1259400)
@Rufo: Wenn ich ehrlich bin, hab ichs kurz versucht zu installieren. Da es nicht auf Anhieb geklappt hat und die Version mit "Work in progress" (bzw. nicht Stable) gekennzeichnet ist hab ichs dann auch nicht weiter versucht.

"Stable" Indy Versionen gab es schon lange nicht mehr. Indy 10.6 enthält aber sehr viele Verbesserungen und Bugfixes, so dass es sich durchaus lohnen kann sie zum Vergleich zu testen. Solange man keine fortgeschrittenen HTTP Features testen muss (Cookies, SSL, Form-Parameter) ist das in Minuten machbar.

Man muss Indy 10.6 nicht in der IDE als Package installieren, sondern lediglich für das konkrete Projekt die Suchpfade auf die Lib/Core, Protocols und System Verzeichnisse setzen. (Solange man nicht absichtlich das DCU Verzeichnis umbiegt, wird die Indy 9 Version wird dadurch nicht angefasst.)

Sir Rufo 19. Mai 2014 16:04

AW: Http Get (aber bitte schnell)
 
Zitat:

Zitat von cherry (Beitrag 1259400)
@Rufo: Wenn ich ehrlich bin, hab ichs kurz versucht zu installieren. Da es nicht auf Anhieb geklappt hat und die Version mit "Work in progress" (bzw. nicht Stable) gekennzeichnet ist hab ichs dann auch nicht weiter versucht.

Wo hast du denn geschaut?

Am besten nimmst du die SVN-Version http://www.indyproject.org/Sockets/Download/svn.DE.aspx

cherry 19. Mai 2014 17:06

AW: Http Get (aber bitte schnell)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hab nun mal ein Beispielprojekt erstellt. Könnt ihr euch das mal anschauen? Ist echt witzig aus dem Delphi Programm ist das Aufrufen des Rest Webservice erheblich langsamer, als die SOAP Variante. Bei mir zeichnet es sich so aus, dass die REST Aufrufe jedes zweite Mal ca. gleich schnell sind.

REST

1080
811
1092
811
...

SOAP

Ist nicht nur konstanter, sondern erheblich schneller...

733
530
530
531
...

Der Aufruf mittels "Addvanced Rest Client Chrome App" ist jedoch am schnellsten...

550
507
507
507
...

Es fällt irgendwie auch auf, dass der erste Aufruf immer etwas länger geht...

Zum Anhang:

WebServerTest ist ein VS2010 Projekt mit einem REST und einem Soap Webservice

WSTestClient der passende Delphi7 Client.

PS:

Rest Service läuft auf Port 8080
http://localhost:8080/Web/Find?text=blabla

SOAP Service auf Port 8000

cherry 20. Mai 2014 07:52

AW: Http Get (aber bitte schnell)
 
Hallo zusammen

Ich habs nun auch noch mit den aktuellsten Indy Komponenten (Trunc) versucht. Leider ist das Ergebnis dasselbe. Entweder mache ich etwas komplett falsch, oder die Komponente hat ein Problem. Wie verhält sich das Demoprogramm bei euch? - Macht ihr da dieselben Beobachtungen?

LG

Phoenix 20. Mai 2014 08:03

AW: Http Get (aber bitte schnell)
 
Okay, mir fehlen hier grundlegende Informationen um auch nur Ansatzweise raten zu können, an was es liegen könnte.

1.) Welches Format fährst Du über REST?
REST kann prinzipiell mal alles rüberschicken. HTML, JSON, auch XML oder CSV sind grundsätzlich möglich. Was nutzt Du konkret?

2.) Wie sieht das aus, wenn Du mal mit konstanten, nicht berechneten Werten arbeitest?
Also konkret, entweder mit Fiddler das Ergebnis cachen oder noch einfacher, das Ergebnis des REST-Calls durch den Browser abrufen, in eine Datei speichern und dann diese als statisches File auf eine andere URI legen, die Du dann über Deinen REST Client abrufst. Damit kannst Du eine konstante, sehr kleine Abrufzeit erreichen, die Deine Messung nicht beeinflusst.

3.) Schneide mal den Traffic zwischen Deinem Client und der Service mit Fiddler mit. Vielleicht bekommst Du hier einige zusätzliche Informationen was hier passiert.

Ich würde ohne diese Infos vermutlich darauf tippen, das hier JSON über die Leitung fliegt und der Teil der das JSON parsed nicht ganz so performant ist, wie eine XML deserialization.
Vielleicht kannst Du mit einem simplen Tweak das Ausgabeformat des Service auf XML forcieren (sollte bei WCF mit einem URL-Parameter gehen), und damit könntest Du ggf. in den Genuss der schnelleren XML-Deserialisierung kommen ohne von REST weg zu müssen. Aber wie gesagt: Ist nur geraten, ohne ausreichend Informationen zu haben.

cherry 20. Mai 2014 09:53

AW: Http Get (aber bitte schnell)
 
Hallo Phoenix

Was kann denn noch fehlen. Ich hab ein minimales Projekt angehängt wo der Fehler zu reproduzieren ist. Zumindest bei mir. Wäre eben interessant ob das bei andern auch so ist.

1) GET anfrage. Rückgabe ASCII String (Das hab ich oben schon erwähnt). Kein JSON kein XML.
2) In meine Beispielprojekt wird die Messung nicht gross durch Berechnungen beeinflusst. Die "Berechnungszeigen" des Servers werden geloggt und sind mehr oder weniger Konstant. Ich habe im Beispielprojekt ein Sleep von 500 ms eingebaut. Das Erstellen von 1000 Random IDs kostet fast nichts. Trotzdem dauert die Anfrage über REST Zeitweise 0.5s Länger als erwartet!
3) Mit TcpTrace sehe ich den Verkehr und das sieht soweit gut aus. Mit Fiddler ists in der Tat komisch... SOAP Variante sehe ich... REST Anfrage über Browser sehe ich auch. In Fiddler tut sich aber rein gar nichts, wenn ich eine REST Anfrage über den Delphi7 Client verschicke. Der Webservice wird aufgerufen, ich erhalte ein Resultat, aber Fiddler sieht nichts?! (TcpTrace siehts, logischerweise). Fiddler kenn ich halt auch zu wenig, keine Ahnung warum ers nicht sieht...

Wenn nicht noch jemand eine Zündende Idee oder ein schwerwiegenden Verdacht hat, werde ich hier aufgeben und mich für die SOAP Variante entscheiden müssen. Ansonsten komme ich hier nie weiter. Wäre toll wenn jemand noch mein Beispiel Programm anschauen könnte, vielleicht sieht ihr da was ???

Lemmy 20. Mai 2014 10:06

AW: Http Get (aber bitte schnell)
 
Win7 Prof, virtualisiert mit 10 GByte RAM auf einem iCore7

REST: Erstaufruf >1000 ms, restliche Aufrufe zwischen 500 ms und 550 ms
Soap: Erstaufruf >1000 ms, restliche Aufrufe zwischen 650 ms und 700 ms


jeweils ca. 10 Aufrufe


Antivirus: Bitdefender AV Plus 2013 deaktiviert:

alle Aufrufe (Soap und Rest) ca. 20-30 ms schneller

Tipp: Schalte mal deinen AV aus und schau dann ob du noch die großen Differenzen hast...

Phoenix 20. Mai 2014 10:52

AW: Http Get (aber bitte schnell)
 
Zitat:

Zitat von cherry (Beitrag 1259481)
Fiddler kenn ich halt auch zu wenig, keine Ahnung warum ers nicht sieht...

Fiddler ist ein Proxy. Das heisst wenn Indy die Browser-Proxy-Config nicht berücksichtigt, müsstest Du dem Indy client noch sagen benutze bitte den Proxy auf localhost, Port 8888 (default).
Danach solltest Du den Request da durchhuschen sehen.

Der angesprochene Virenscanner könnte allerdings tatsächlich eine Bremse sein.

cherry 20. Mai 2014 11:09

AW: Http Get (aber bitte schnell)
 
Liste der Anhänge anzeigen (Anzahl: 1)
So. Hab nun den Delphi Client so erweitert, dass der Rest Service auch direkt über Sockets angesprochen wird (Anstatt TIdHttp Komponente o.ä). Nun bringt das ganze leider auch keine Verbesserung die Anfragezeiten verhalten sich gleich wie mit der TIdHttp Komponente...

Ich schnalls echt nicht, wie der Browser ("Advanced Rest Client" App für Chrome) hier schneller sein kann?! Das Verhalten ist völlig unterschiedlich. Obwohl ich zum Testen sogar genau denselben HTTP Header verwendet habe. Der Server sollte daher die Anfragen genau gleich behandeln...

Werde das gleich mal prüfen mit dem Virenschutz...

@Lemmy Danke fürs Testen. Interessant, bei dir verhält es sich ja so, wie ich mir das Ursprünglich vorgestellt habe. Vorallem treten bei dir keine Schwankungen auf mit der REST Variante, sehr interessant...

cherry 20. Mai 2014 12:05

AW: Http Get (aber bitte schnell)
 
Also wenn ich das ganze auf einem anderen Rechner (ohne Virenschutz) laufen lasse, dann funktionierts tatsächlich. Keine Schwankungen mehr und REST ist wie erwartet etwas schneller. Hab allerdings noch nicht herausgefunden, warum es auf meinem Rechner nicht geht (ausschalten des Virenschutzes bringt leider nichts).

In diesem Sinne liegt das Problem also weder beim Server noch beim Client, sondern irgendwo dazwischen. Probiere das Problem bei Gelegenheit noch genauer ausfindig zu machen. Eine Frage bleibt allerdings im Moment noch offen:

- Warum betrifft es nur die Delphi REST Variante (weder SOAP noch Browser REST) haben hier ein Problem ?

Vielleicht ergibt das einen Sinn, wenn ich herausgefunden habe, was hier dazwischenfunkt...

mkinzler 20. Mai 2014 12:10

AW: Http Get (aber bitte schnell)
 
Viele Virenscanner/Firewalls transpaltieren sich derart tief ins System, so daß eine einfache Deaktivierung oft nichts mehr bringt.

Uwe Raabe 20. Mai 2014 12:20

AW: Http Get (aber bitte schnell)
 
Zitat:

Zitat von mkinzler (Beitrag 1259510)
Viele Virenscanner/Firewalls transpaltieren sich derart tief ins System, so daß eine einfache Deaktivierung oft nichts mehr bringt.

Das grenzt dann aber schon hart an Malware.

mkinzler 20. Mai 2014 12:21

AW: Http Get (aber bitte schnell)
 
Ist aber imho gängige Praxis.

Jumpy 20. Mai 2014 13:16

AW: Http Get (aber bitte schnell)
 
Ist das nicht immer so? Je mehr und je länger man einen Feind bekämpf, umso ähnlicher wird man ihm?

jaenicke 20. Mai 2014 21:20

AW: Http Get (aber bitte schnell)
 
Wenn sich ein Virenscanner zu leicht komplett deaktivieren lässt, schafft das auch Malware...
Deshalb bleiben viele so weit aktiv um sich davor noch schützen zu können.

cherry 28. Mai 2014 15:47

AW: Http Get (aber bitte schnell)
 
Hallo zusammen

Vielen Dank für eure Hilfe...
Es war tatsächlich so. Hab mal für einen Kunden eine VPN Verbindung eingerichtet, die ich vergessen habe... Der hatte auch noch einen aktiven Webfilter. Hab echt nicht mehr daran gedacht... Nach der Deinstallation verhält sich alles wie gewünscht. REST ist ein bisschen schneller. Interessant nur, dass der Webfilter die SOAP Nachrichten nicht gescannt hat, die andern aber schon?!...

Schönes Wochenende
LG


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz