Leo --

Your concern about speed has been raised before, but I still don't see it 
(one of the reasons I've been working on a toy VM to demonstrate is that I 
figure there's some piece I'm not communicating well, and being able to 
point at code would help). Optable build time is not a function of program 
size, but rather of optable size, since it would be (at least 
conventionally/normally) built as a sort of preamble in the generated 
bytecode.

My latest thinking is to divorce the two issues: dynamic optables and 
dynamic loading (of anything). In the past, I've considered both pieces 
important (and I still think that), but now I think even if you statically 
link all the ops, still doing dynamic optables is a win (and enables us to 
implement dynamic loading of oplibs eventually).

I am not against having some oplibs (core) statically linked, so we are 
not in disagreement there. Over the long haul, we might disagree as to 
what constitutes a "core" op, but I don't think that bears on whether or 
not dynamic optables are right for Parrot.

Having dynamic optables means that we do not require core.ops to ever 
stabilize entirely. That will be handy for a while yet during development 
(as you mention), and will remain handy as Parrot evolves through later 
versions and we discover we wish we had op X but don't (something I think 
you see as unlikely, but I see as likely). Dynamic optables essentially 
reduce friction -- they give us the freedom to add ops however and 
wherever we want without having to overcome a barrier created by a desire 
to not obsolete people's existing PBC files.

I don't think it remains a problem how to run ops from different oplibs 
_fast_. Op lookup is already fast (assuming it hasn't slowed significantly 
from where I left it). Here is an email that mentions the original 
switch() based find_op() oplookup performance being on a par with the 
interpreter's ops/sec rating:

    http://archive.develooper.com/perl6-internals@;perl.org/msg08629.html

So, that would mean that for the oplookup part, you would have the 
equivalent of executing an extra N ops (remember that the mops.pasm idea 
of "an op" is one of the fastest ops in the interpreter, too) *only at the 
startup of your program*. There would be some additional cycles eaten to 
do the optable build besides the oplookup, but I assume that the bits and 
pieces of that are going to be fast, too, since it would likely leverage 
other dynamic list code that has been optimized for speed. After the 
preamble, while the program is running, the cost of having a dynamic 
optable is absolutely *nil*, whether the ops in question were statically 
or dynamically loaded (if you don't see that, then either I'm very wrong, 
or I haven't given you the right mental picture of what I'm talking 
about).

BTW, here's the email where I show the benchmarker I used to measure the 
oplookup speed with the original switch() implementation of find_op(). It 
looks up a single op numerous times. Of course, a better one would 
randomly pick a known op name N times and look that up.

    http://archive.develooper.com/perl6-internals@;perl.org/msg08676.html



Regards,

-- Gregor





Leopold Toetsch <[EMAIL PROTECTED]>
11/04/2002 05:40 AM
 
        To:     [EMAIL PROTECTED]
        cc:     Brent Dax <[EMAIL PROTECTED]>, "'Andy Dougherty'" 
<[EMAIL PROTECTED]>, Josh Wilmes <[EMAIL PROTECTED]>, "'Perl6 
Internals'" <[EMAIL PROTECTED]>
        Subject:        Re: Need for fingerprinting? [was: Re: What to do if 
Digest::MD5 is 
unavailable?]


[EMAIL PROTECTED] wrote:

> Leo --
 
> Here's one of the messages about how I'd like to see us link op 
> implementations with their op codes:
> 
>     http://archive.develooper.com/perl6-internals@;perl.org/msg06193.html

Thanks for all these pointers.

I did read this thread WRT dynamic opcode loading. We will need a 
possibility to load different oplibs. But for the core.ops I'd rather 
stay with the static scheme used now.

Your proposal would solve the problem with fingerprinting, but 
especially for huge programs, the loadtime overhead seems to big for me. 
Invalid PBC files due to changes will get less and less, during 
development of parrot, when the core.ops stabilizes.

Remaining is the problem, how to run ops from different oplibs _fast_.

leo



Reply via email to