Part of our ERP system is a sub-system for running background jobs. We track a variety of meta-data about our jobs in a table including timestamps for submitted, started, and end times.
I'm creating a report showing the performance of our job system, detailed by day. One KPI is maximum # of jobs running at once. The algorithm I'm currently using is:
dim cnt as integer 'number of overlapping jobs
dim max as integer 'maximum number of jobs running at one time
for each Job where
Job.SubmitTs = today
'bJob is a 2nd instance of Job
for each bJob where
bJob.SubmitTs = today and
bJob.StartTs <= Job.EndTs and
bJob.EndTs >= Job.EndTs
cnt = cCnt + 1
next
if cnt > max then max = cnt
next
The problem with this algorithm is that it is very slow due to all the looping. I was wondering if there is a faster way to implement this?
Edit
I cannot use SQL queries to access the data.
Best Answer
then iterate over the (2*N) elements as follows:
Complexity: O(n.log(n)) for initial build of the sorted structure + O(n) for the iteration through its elements.
Edit: It has been suggested by Giorgio that an array is used, which is a better option. (The suggestion originally was to use a red/black tree, but no task removing capability seems to be needed, so maintaining order is trivial).