Mantra coming along (speed test vs Python)
Mantra is coming along nicely. Added type annotations, but am not doing anything with them yet. Without much optimization (and huge amounts of memory allocation), Mantra loop and list append are looking good:
a = [];
1..5000000:{int i | a += i;};
The equivalent python:
a = [];
for i in range(5000000):
a.append(i);
My unscientific wallclock measurements on my dual cpu mac (powerpc) with Java 1.5 shows Java doing about 3.0s vs 3.9s in python. I am using way more memory though I think.
When I make use of type info manually converting the += operator to a direct list.add operation rather than general message send, it goes much faster: 2.6s. I simply converted:
main_locals.a.invoke("+=",new mobject[]{closure1_args.i});
to
((mlist)main_locals.a).add(closure1_args.i);
On the other hand, python's highly optimized file I/O kicks Mantra's butt right now. Here is my word frequency code:
// for each filename, generate a histogram
wfreq = map();
args:{ string filename |
f = File(filename);
f => words() => { string w |
c=wfreq[w];
if ( c is null ) wfreq[w]=mutint(1);
else c++;
};
};
pairs = wfreq.items(); // return list of 2-tuples (key/value pairs)
pairs.sort({int x, int y | return x[1].compareTo(y[1]);});
pairs.backwards():{list p | print(p[1]); print(" "); println(p[0]);};
Processing a 5M file of text, takes about 3.6s in Mantra, but only 1.1s in Python. Here's the python code:
import sys
import string
freqtable = {}
def processfile(file, ftable):
infile = open(file, 'r')
for line in infile:
words = line.split()
for w in words:
try:
ftable[w] = ftable[w] + 1
except KeyError:
ftable[w] = 1
infile.close()
for f in sys.argv[1:]:
processfile(f, freqtable)
wordlist = freqtable.items()
wordlist.sort((lambda x, y : cmp(x[1], y[1])))
wordlist.reverse()
for p in wordlist:
print p[0], p[1]