Friday, August 29, 2008

Cecil Reloaded

For our hack week here at Novell I continued hacking on making vbnc work with Cecil, and yesterday I reached the point where vbnc is able to compile itself using only Cecil (in my previous post I also said vbnc was able to bootstrap, but back then vbnc was still using SRE to do all the hard work, and Cecil just to write the final assembly to disk).

The initial performance problems are mostly gone, it's still not quite as fast as before, but there are also quite a few low-hanging fruit yet in that area. The first successful bootstrap yesterday took 40 seconds (compared to 12 seconds for the normal vbnc), and after a few optimizations I'm now down at 24 seconds. Almost all of that time was gained by allocating less strings, the first non-optimized version allocated ~1.4 GB of strings, and it's now down to 119 MB.

I'm also using a delay-loading mechanism to load data from referenced assemblies on-demand, this is not that visible when you compile a lot of code in one go, but it sure make a difference when compiling thousands of 15-20 line tests one by one.

I'm pretty confident I can get compilation time down to the 12 seconds I had before, especially given that Cecil hasn't been much optimized [1] (not actually used by compilers) before, while Mono's SRE implementation is known to be quite fast.

As a sidenote the actual amount of code in the compiler has decreased, from ~75k lines with the normal vbnc to ~68k for the cecil version.

[1] Sébastien Pouliot corrected me, cecil is used by some know compilers, and probably some unknown too. Some parts of Cecil has also been optimized already.

1 comment:

  1. Hi! Is it possible for you to introduce new features to the language?

    Particularly the property get/set construction seems bogus (especially the get method seems useless).

    Why not to make property method something opposite a function:
    function - the code executes on read.
    property - the code executes on set.

    At the property declaration there created a global variable with the same name.

    Example:

    Class Foobar
    Public Property Size As Integer
    FooButton.Size=Size
    Me.Redraw
    End Property

    ...
    End Class

    So it works somewhat like Property Set method, but also symmetrical (but opposite) to Function construct. On property read no method is called.

    ReplyDelete