vermutlich grundlegendes Leistungsproblem bei Networkf.!?

Fragen und Bugreports zur PureBasic 4.0-Beta.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

vermutlich grundlegendes Leistungsproblem bei Networkf.!?

Beitrag 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
Zuletzt geändert von Toshy am 31.03.2006 05:32, insgesamt 3-mal geändert.
1. Win10
PB6.1
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
grapy
Beiträge: 108
Registriert: 09.09.2004 09:05

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
DataMiner
Beiträge: 220
Registriert: 10.10.2004 18:56

Beitrag 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
__________________________________________
Weniger glauben - mehr wissen!
------------------------------------------------------
Proud beneficial owner of SpiderBasic, PureBasic 3.x, 4.x, 5.x and PureVisionXP
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Gesperrt