Seite 1 von 1

vermutlich grundlegendes Leistungsproblem bei Networkf.!?

Verfasst: 30.03.2006 21:10
von Toshy
Hallo.

Ich hatte Freak schon mal in einem Beitrag angesprochen, aber er hatte wohl noch keine Zeit da nochmals reinzuschauen.
Da mein Englisch zu schlecht ist kann ich Fred nicht direkt fragen.

Ich versuche eine optimale Netzwerkroutine zu entwickeln. Das große Problem dabei ist wenn man mit vielen Clienten verbunden ist diese zu verwalten. Man muß wenn ein Event ankommt (am Server) die ClientID in einer Verwaltung suchen und dann entsprechendes Auslösen. Was bei wenigen Clienten noch schnell geht, iost ab spätestens 1000 Clienten so langsam, das das PRogremm einschläft. Das liegt in erster Linie daran das man je Event die Veraltung durchlaufen muß. Schneller geht es wenn man einen errerchenbaren Index verwendet, das geht aber nicht so einfach, ich komme dem aber schon recht nahe.

Nun ist mir aber in den Sinn gekommen, da die ClientID von PB NICHT der SystemID /Socket gleicht, das PB dann auch bei JEDEM Event das ankommt selbst erst in einer Verwaltung suche muß welche Socket welcher ClientID zuzuordnen ist bevor es dem PBuser übermittelt wird. Dies scheint so zu sein, wenn dem aber wirklich so ist, dann macht es einem unmöglich richtig Leistungsfähige Netzwerkprogramme zu schreiben ohne die Socketprogrammierung wieder selbst zu übernehmen.

Vielleicht kann Andre oder jemand anders der englisch spricht Fred mal danach fragen.

Ich habe mal per LoopBackadresse (127.0.0.1) auf meinem WinXP rechner bis zu 3000 Verbindungen erstellt. Anfangs ging das senden von Daten (1Byte") noch schnell, aber um so mehr ClientID`s existierten um so langsamer wurde alles. Und nach bisherigen Tests (in meinen anderen Codes und Programmen) hat das weniger damit zu tun, das viele Netzwerkverbindungen existierten, sondern vor allem mit der ClientIDverwaltung von PB.

Es wäre nett, wenn dieses Grundlegende Anliegen mit eurer Hilfe gelöst werden kann oder besser gesagt bestätigt oder widerlegt wird.
Es wäre halt schade wenn man die Socketprogrammierung selbst übernehmen müßte (kenne mich da so gut wie nicht aus, lese da gerade ein wenig).


Code: Alles auswählen

OpenConsole()
InitNetwork()
sid = CreateNetworkServer(#PB_Any,5555)
PrintN("ServerID="+Str(sid))

ConnectionIDold.l
ConnectionIDold_c.l
*DatenBuffer = AllocateMemory(1000)
For i = 1 To 3000
   s = ElapsedMilliseconds()
   cid = OpenNetworkConnection("127.0.0.1",5555)
   ;PrintN("ClientID_c("+Str(i)+")="+Str(cid))
   Debug "ClientID_c("+Str(i)+")="+Str(cid)
   
   If cid > 0
      ;PrintN("ConnectionID_c_("+Str(i)+")="+Str(ConnectionID(cid))  +"|diffConn="+ Str(  ConnectionID(cid)-ConnectionIDold )  )
      Debug "ConnectionID_c_d("+Str(i)+")="+Str(ConnectionID(cid))  +"|diffConn="+ Str(  ConnectionID(cid)-ConnectionIDold )
      ConnectionIDold = ConnectionID(cid)
   EndIf
   
   ;
   ;Repeat
      NetworkServerEvent.b = NetworkServerEvent() 
      If NetworkServerEvent > 0
         ServerId.l = EventServer()
         ClientID.l = EventClient()
         string.s = "ConnectionID_S("+Str(0)+")="+Str(ConnectionID(ClientID))  +"|diffConn="+ Str(  ConnectionID(ClientID)-ConnectionIDold_c )  +"|timer="+Str(ElapsedMilliseconds()-s)
         ;PrintN(string)
         ConnectionIDold_c = ConnectionID(ClientID)
         ;Delay(1000)
      EndIf
      ;Debug NetworkServerEvent
   ;Until NetworkServerEvent = 0
      If i = 1 Or i = 500 Or i = 1000 Or i = 1500 Or i = 2000 Or i = 2500 Or i = 3000
      Delay(100)
      If cid > 0
          s = ElapsedMilliseconds()
         For t =1 To 100
            SendNetworkString(cid, "x")
            NetworkServerEvent.b = NetworkServerEvent() 
            If NetworkServerEvent > 0
               ServerId.l = EventServer()
               ClientID.l = EventClient()
               If NetworkServerEvent = #PB_NetworkEvent_Data  
                  ReceiveNetworkData(ClientID, *DatenBuffer, 10)
               EndIf
            EndIf
         Next t
         string.s = "SendData -> |timer="+Str(ElapsedMilliseconds()-s)
         PrintN(string)
         Delay(10000)
      EndIf
   EndIf
   
     
   Delay(10)
Next i

Delay(120000)
CloseConsole()
Ausgabe bei mir auf einem WinXP-PC z.B.
ServerID=3546776
SendData -> |timer=63
SendData -> |timer=281
SendData -> |timer=641
SendData -> |timer=2562
SendData -> |timer=1891
SendData -> |timer=4562
......
Gruß
Toshy

Verfasst: 31.03.2006 00:06
von mk-soft
Also,

Ich habe Dein Beispiel bei mir mal durchlaufen lassen und das Ergenis lag immer zwischen 0 und 31
Wie sind den deine Ergebnisse.

Info zur Maschine:
Celerron 1800Mgz mit XP Home SP2 und Optimiert auf Internet-Verbindung DSL

FF :wink:

Verfasst: 31.03.2006 18:06
von grapy
Ausgabe bei mir auf einem WinXP-PC:
ServerID=9051800
SendData -> |timer=0
SendData -> |timer=0
SendData -> |timer=0
SendData -> |timer=0
SendData -> |timer=0
SendData -> |timer=0
......
:mrgreen: grapy :mrgreen: Venice 3500+ 2GB RAM

Verfasst: 01.04.2006 02:46
von mk-soft
@Toshy,

Bin Blind. Deine ergebnisse stehen ja doch drin.

Könnte ein Problem mit Dein XP-Home sein (wenn´s Home ist).
Hatte mal ein Optimierungstool auf meiner Maschine gestartet umd Meldet auch das nicht genügend Verbindungsresourcen zu verfügung standen.

FF :wink:

Verfasst: 01.04.2006 11:27
von DataMiner
Habs mehrfach durchlaufen lassen. Immer die gleichen Werte:
SendData -> |timer=0
SendData -> |timer=141
SendData -> |timer=234
SendData -> |timer=437
SendData -> |timer=563
SendData -> |timer=703
SendData -> |timer=859
Xp pro SP2

Verfasst: 01.04.2006 12:10
von ts-soft
SendData -> |timer=16
SendData -> |timer=16
SendData -> |timer=0
SendData -> |timer=0
SendData -> |timer=16
SendData -> |timer=0
SendData -> |timer=16
Athlon XP 2400
512 MB RAM
WinXP Pro SP2