From 9161371a3215e5be0f010d83bd26a9655abe338e Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Mon, 11 Aug 2014 20:41:52 +0200 Subject: perf: Various changes to speed up various operations * Do not use >>#instVarNamed:put: but add selectors * Pre-allocate some arrays with a default string to avoid re-allocations at the start * Share same parser trees to avoid construction costs * Remove some lazy allocation and always allocate it --- callagent/SIPResponse.st | 23 ++++++++++++++++------- callagent/parameters/SIPCSeq.st | 20 ++++++++++++++++---- callagent/parameters/SIPGenericParam.st | 19 ++++++++----------- callagent/parameters/SIPToFromParam.st | 20 ++++++++++++++++---- callagent/parameters/SIPVia.st | 26 +++++++++++++++++++++----- callagent/parser/Extensions.st | 2 +- callagent/parser/SIPParser.st | 2 +- 7 files changed, 79 insertions(+), 33 deletions(-) (limited to 'callagent') diff --git a/callagent/SIPResponse.st b/callagent/SIPResponse.st index 0058849..6c41faa 100644 --- a/callagent/SIPResponse.st +++ b/callagent/SIPResponse.st @@ -38,12 +38,17 @@ Object subclass: SIPResponse [ SIPResponse class >> code: code with: phrase [ - ^ self new - instVarNamed: #code put: code; - instVarNamed: #phrase put: phrase; + ^ self basicNew + initialize; + code: code; + phrase: phrase; yourself ] + initialize [ + params := OrderedCollection new: 7. + ] + code: aCode [ code := aCode @@ -59,6 +64,10 @@ Object subclass: SIPResponse [ ^ code ] + phrase: aPhrase [ + phrase := aPhrase + ] + phrase [ ^ phrase @@ -66,12 +75,12 @@ Object subclass: SIPResponse [ parameters [ - ^ params ifNil: [params := OrderedCollection new] + ^params ] addParameter: aPar value: aValue [ - self parameters add: (aPar -> aValue). + params add: (Association key: aPar value: aValue). ] parameter: aPar [ @@ -79,7 +88,7 @@ Object subclass: SIPResponse [ ] parameter: aPar ifAbsent: absent [ - self parameters do: [:each | + params do: [:each | (each key sameAs: aPar) ifTrue: [^ each value]]. ^absent value. @@ -105,7 +114,7 @@ Object subclass: SIPResponse [ nextPutAll: phrase; cr; nl. - self parameters do: [:each | + params do: [:each | out nextPutAll: each key; nextPutAll: ': '; diff --git a/callagent/parameters/SIPCSeq.st b/callagent/parameters/SIPCSeq.st index 09468cb..695750b 100644 --- a/callagent/parameters/SIPCSeq.st +++ b/callagent/parameters/SIPCSeq.st @@ -23,13 +23,25 @@ SIPParam subclass: SIPCSeq [ SIPCSeq class >> parseFrom: aParseDict [ - ^ self new - instVarNamed: #data put: aParseDict asFoldedString; - instVarNamed: #number put: aParseDict first asInteger; - instVarNamed: #method put: aParseDict third; + ^ self basicNew + data: aParseDict asFoldedString; + number: aParseDict first asInteger; + method: aParseDict third; yourself ] + data: aData [ + data := aData + ] + + number: aNumber [ + number := aNumber + ] + + method: aMethod [ + method := aMethod + ] + number [ ^ number diff --git a/callagent/parameters/SIPGenericParam.st b/callagent/parameters/SIPGenericParam.st index 789b13d..fcf8048 100644 --- a/callagent/parameters/SIPGenericParam.st +++ b/callagent/parameters/SIPGenericParam.st @@ -63,17 +63,14 @@ Object subclass: SIPGenericParam [ asFoldedString [ | str | - str := (WriteStream on: (String new)) - nextPutAll: key; - yourself. - - value isNil ifFalse: [ - str - nextPut: $=; - nextPutAll: value. - ]. - - ^ str contents + ^value isNil + ifTrue: [key] + ifFalse: [ + (WriteStream on: (String new: key size + value size + 1)) + nextPutAll: key; + nextPut: $=; + nextPutAll: value; + contents]. ] isGenericSIPParam [ diff --git a/callagent/parameters/SIPToFromParam.st b/callagent/parameters/SIPToFromParam.st index 46702a1..f911aa9 100644 --- a/callagent/parameters/SIPToFromParam.st +++ b/callagent/parameters/SIPToFromParam.st @@ -31,13 +31,25 @@ SIPParam subclass: SIPToFromParam [ SIPToFromParam class >> parseFrom: anArray [ - ^ self new - instVarNamed: #addr put: anArray first third; - instVarNamed: #data put: anArray asFoldedString; - instVarNamed: #params put: (self buildParams: anArray second); + ^ self basicNew + address: anArray first third; + data: anArray asFoldedString; + params: (self buildParams: anArray second); yourself ] + address: anAddress [ + addr := anAddress + ] + + data: aData [ + data := aData + ] + + params: aParam [ + params := aParam + ] + address [ ^ addr diff --git a/callagent/parameters/SIPVia.st b/callagent/parameters/SIPVia.st index 4c5f5b2..dc94d06 100644 --- a/callagent/parameters/SIPVia.st +++ b/callagent/parameters/SIPVia.st @@ -35,14 +35,30 @@ SIPParam subclass: SIPVia [ (aParseDict at: 7) second ifNotNil: [:val | port := val second asInteger]. - ^ self new - instVarNamed: #data put: aParseDict asFoldedString; - instVarNamed: #address put: (aParseDict at: 7) first; - instVarNamed: #port put: port; - instVarNamed: #branch put: (self findBranch: (aParseDict at: 8)); + ^self basicNew + data: aParseDict asFoldedString; + address: (aParseDict at: 7) first; + port: port; + branch: (self findBranch: (aParseDict at: 8)); yourself ] + data: aData [ + data := aData + ] + + address: anAddress [ + address := anAddress + ] + + port: aPort [ + port := aPort + ] + + branch: aBranch [ + branch := aBranch + ] + branch [ ^ branch ] diff --git a/callagent/parser/Extensions.st b/callagent/parser/Extensions.st index 1eea8fd..d6933d4 100644 --- a/callagent/parser/Extensions.st +++ b/callagent/parser/Extensions.st @@ -19,7 +19,7 @@ Array extend [ asFoldedString [ - ^ (Osmo at: #SIPParser) combineUri: self. + ^ Osmo.SIPParser combineUri: self. ] ] diff --git a/callagent/parser/SIPParser.st b/callagent/parser/SIPParser.st index fb9c71c..bbc42b3 100644 --- a/callagent/parser/SIPParser.st +++ b/callagent/parser/SIPParser.st @@ -36,7 +36,7 @@ SIPGrammar subclass: SIPParser [ SIPParser class >> combineUri: anArray [ | str | - str := WriteStream on: (String new). + str := WriteStream on: (String new: 20). self addArrayRec: anArray on: str. ^ str contents ] -- cgit v1.2.3