Avatar billede Droa Seniormester
04. juni 2013 - 13:09 Der er 4 kommentarer og
1 løsning

Hurtigeste måde at opbevare objekter i hukommelsen

Hej eksperter.

Jeg er igang med at lave et udpsocket program der skal være hurtigt, og udviklet til .Net CLR.

det største problem er nok at programmet skal modtage mellem 50-600 pakker i minuttet.

alle pakkerne har en pakketype fra et nummer mellem 0 til 722, som det er lige nu, bliver alle pakkerne lagt i en type pakke objekt.
men jeg bliver nok nød til at lave nogen extendet pakker, der kan indeholde ydereligere information.

f.eks pakke type nummer 152 (EventCall)
kan være formateret på flere måder efter hvad eventet skal fortælle.


eks 1:
END CALL:0001 (ffffffff)

eks 2:
CREATE CALL:0001 (ffffffff)

eks 3:
0.01022.0 -1 BaseEP: NEW CMEndpoint f1f1f1f1 TOTAL NOW=1 CALL_LIST=0

eks 4:
0.01022.0 -1 BaseEP: DELETE CMEndpoint f1f1f1f1 TOTAL NOW=0 CALL_LIST=0


Jeg har overvejet nogen måder at finde ud af hvad typer der er hvad, siden jeg har mange pakker der opføre sig sådan, og tit i mere komplekse udfoldelser.

siden jeg har modtaget strengene som pakker, har jeg jo selvfølgelig pakkenerne som et byte array.
så jeg tænkte om det var hurtigere at lave ascii karakter tjek på mit byte array, end at bruge regex?


Jeg har lavet et eksempel for hvad jeg mener, med en af mine pakker.


443: Digit Pressed 0

Public Shared Function isDigitPressed(bytes() As Byte) As Boolean
            'Er dette en informationspakke nummer 501 
            '10 = 1
            '11 = 245
            'Tekst Starter på punkt 32 til slut
            '32,x = x
            If bytes(10) = 1 And bytes(11) = 245 Then
                Dim valid As Boolean = False

                For i As Integer = 32 To bytes.Length - 1
                    If bytes(i) > 47 And bytes(i) < 58 Then
                        valid = True
                    ElseIf bytes(i) = 58 Then
                        Exit For
                    Else
                        valid = False
                        Exit For
                    End If
                Next
                Return valid
            End If

            Return False
        End Function


Personligt kender jeg ikke meget til hvordan vb.net behandler arrays, og jeg har mindre kendskab til regex methoderne, om de er hurtigere
Avatar billede arne_v Ekspert
05. juni 2013 - 02:24 #1
Med 600 pakker i minuttet, saa tvivler jeg paa at det bliver et problem at parse uanset hvordan du goer det.

En moderne CPU kan vil udfoere ca. en milliard instruktioner i sekudndet.

600/minut = 10/sekund.

Det betyder at du bare skal parse en pakke med mindre end 100 millioner instruktioer for at kunne foelge med.
Avatar billede arne_v Ekspert
05. juni 2013 - 02:25 #2
Hvis du gav mig nogle komplette byte arrays (som hex), saa kunne jeg evt. demo'e diverse maader at parse paa.
Avatar billede Droa Seniormester
06. juni 2013 - 10:40 #3
Ja jeg havde samme ide, jeg tror det var mit design der gjorde det langsomt..

jeg havde HentPakker og SendPakker i samme loop, på deres egen tråd, hvor SendPakker skulle sende et Ping engang imellem, og HenPakker skulle modtage et Pong derefter.
Nogengange gik der over 10 sekunder imellem ping og pong, hvis der kom for mange pakker ind af gangen.

Jeg tror det var noget med at jeg havde en delegate til en RichTextBox jeg sendte alt teksten til.. jeg går ud fra det er den som gjorde/gør mit loop så langsomt.

Jeg overvejer at lave en ny tråd der kan gøre dette job asynkront med min client socket tråd, så jeg ikke får det store delay.
Avatar billede arne_v Ekspert
07. juni 2013 - 03:42 #4
GUI opdatering boer ikke kunne forsinke 10 sekunder.

Men der er nok en eller andet som forsinker meget.

Hvorfor bruger du UDP og ikke TCP?
Avatar billede arne_v Ekspert
30. juli 2013 - 04:45 #5
all set?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester