Here’s something I’ve learned today.
In order to pinpoint what page the user is requesting I have a map built with all legitimate page paths as key and the type that’s associated with that call as value.
It’s been fast and sufficient for my needs. But as times pass and clients request more and more functionality, the map grows.
Today I was pondering if this approach actually is the fastest for fairly large maps. To find out I’ve setup a test to compare it with a match / case construction.
Here’s the code I’ve used for testing:
local(
timervalue = 1000
)
timer(#timervalue) => {^
local(
bigmap = map(
'1_Lorem' = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.',
'2_Lorem' = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.',
'3_Lorem' = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.',
'4_Lorem' = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.',
'5_Lorem' = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.',
'6_Lorem' = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.',
'7_Lorem' = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.',
'8_Lorem' = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.',
'9_Lorem' = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.',
'10_Lorem' = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.',
// etc up to 500 items
'500_Lorem' = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.',
),
output = ''
)
loop(200,100) => {
#output -> append(loop_count + #bigmap -> find(loop_count + '_Lorem'))
}
#output
^}
timer(#timervalue) => {^
local(
output = ''
)
loop(200,100) => {
match(loop_count + '_Lorem') => {
case('1_Lorem') #output -> append(loop_count + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.')
case('2_Lorem') #output -> append(loop_count + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.')
case('3_Lorem') #output -> append(loop_count + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.')
case('4_Lorem') #output -> append(loop_count + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.')
case('5_Lorem') #output -> append(loop_count + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.')
case('6_Lorem') #output -> append(loop_count + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.')
case('7_Lorem') #output -> append(loop_count + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.')
case('8_Lorem') #output -> append(loop_count + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.')
case('9_Lorem') #output -> append(loop_count + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.')
case('10_Lorem') #output -> append(loop_count + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.')
// etc up to 500 items
case(’500_Lorem') #output -> append(loop_count + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris consequat ornare lectus, dignissim iaculis libero consequat sed.')
}
}
#output
^}
My findings indicate that match / case is significantly faster than find in a map.
Find in map:
array((micros = 12935079.000000), (micros_average = 12935.079000))
Match / case
array((micros = 5641225.000000), (micros_average = 5641.225000))
My conclusion is that if the dataset you’re looking into is fixed (as in almost never changes and can be defined in code) it is better from a speed perspective to do match / find.
But, if the dataset is dynamic then it’s probably more convenient to turn it into a map and use that.
HDB
Jolle
#############################################################
This message is sent to you because you are subscribed to
the mailing list Lasso Lasso@lists.lassosoft.com
Official list archives available at http://www.lassotalk.com
To unsubscribe, E-mail to: <Lasso-unsubscribe@lists.lassosoft.com>
Send administrative queries to <Lasso-request@lists.lassosoft.com>