SQL Challenge vs. Progress 4GL
One of the newsletters I subscribe to is the SQLCentral solutions. A couple of weeks ago they issued the Summer SQL Stumpers 2009, asking for the fastest way to calculate all the primes 1000 or lower. The fastest solution they came up with runs in about 7 seconds, which I thought was terribly slow for the algorithm used (Sieve of Atkins and Aristophanes), and I thought I’d give Progress a try. I came up with the following:
DEFINE TEMP-TABLE ttPrime
FIELD prime AS INTEGER
INDEX prime prime.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE test-val AS INTEGER NO-UNDO.
ETIME(TRUE).
DO i = 1 TO 1000:
CREATE ttPrime.
ASSIGN
ttPrime.prime = i.
END.
DO i = 2 TO 499:
ASSIGN test-val = i * 2.
REPEAT WHILE test-val < = 1000:
FOR FIRST ttPrime
WHERE ttPrime.prime = test-val
EXCLUSIVE-LOCK:
DELETE ttPrime.
END.
ASSIGN test-val = test-val + i.
END.
END.
MESSAGE "Etime" ETIME
VIEW-AS ALERT-BOX INFO.
FOR EACH ttPrime
NO-LOCK:
DISPLAY ttPrime.
END.
On my machine the procedure runs in about 93 milliseconds, and as far as I can see the results are accurate. Progress 4GL FTW!