1. Edita on 4.0b3 (r3124)

Still runs like a dog... Hacked it down to another ref count foulup very similar to the last:

function ConvertTabs(sequence intxt) 
    return intxt 
end function 
 
constant MAX=100000 
sequence filetext 
    filetext = {repeat("1234567890\n",MAX)} 
 
atom t 
    t = time() 
 
for i=1 to MAX do 
--    if i<=length(filetext[1]) then 
        filetext[1][i] = ConvertTabs(filetext[1][i]) 
--    else 
--        ?9/0 
--    end if 
    if remainder(i,4000)=0 then 
        printf(1,"unpacking %d\n",i) 
    end if 
end for 
 
printf(1,"%3.2fs\n",time()-t) 

Above works fine. Uncomment the (pointless) length test and it is three thousand, eight hundred and seventeen times slower.

Pete

PS: Jesse reported problems with the old version of Edita/Arwen (reserved word 'label' on line 210 etc). These were fixed in 0.3.2 all along, the entry in the archive now points at http://www.edita.isgreat.org.

new topic     » topic index » view message » categorize

2. Re: Edita on 4.0b3 (r3124)

petelomax said...

Still runs like a dog... Hacked it down to another ref count foulup very similar to the last:

Thanks, that's very helpful. Basically, the temp referenced in the length call doesn't get released until after the end if. I suppose the better way to deal with this is to insert a DEREF_TEMP at the start of the main if block, each elsif block, and the final else block. The key, though is noticing when there is no else block, and creating one to make sure the temp is not leaked.

Matt

new topic     » goto parent     » topic index » view message » categorize

3. Re: Edita on 4.0b3 (r3124)

mattlewis said...
petelomax said...

Still runs like a dog... Hacked it down to another ref count foulup very similar to the last:

Thanks, that's very helpful. Basically, the temp referenced in the length call doesn't get released until after the end if. I suppose the better way to deal with this is to insert a DEREF_TEMP at the start of the main if block, each elsif block, and the final else block. The key, though is noticing when there is no else block, and creating one to make sure the temp is not leaked.

This is now fixed in svn:3131.

Matt

new topic     » goto parent     » topic index » view message » categorize

4. Re: Edita on 4.0b3 (r3124)

mattlewis said...

Thanks, that's very helpful. Basically, the temp referenced in the length call doesn't get released until after the end if. I suppose the better way to deal with this is to insert a DEREF_TEMP at the start of the main if block, each elsif block, and the final else block. The key, though is noticing when there is no else block, and creating one to make sure the temp is not leaked.

This is now fixed in svn:3131.

Matt

Thanks. I am pleased to say Edita now runs OK on r3132

Of course I immediately tried something else ("if filetext[1]=filetext[1] then", if you must know) which ran fine on r3132 but gave me problems on Phix. So, I examined your mods to parser.e, which gave me two thoughts:

(NB: this is now firmly in low-priority territory)

First, you may not need the additional code. My analysis (I use different opcodes to you, remember) was that only 8 things create dangerous refcounts (move?, subscript, slice, append, prepend, concat, repeat, and make sequence), and only 8 things "clone" due to non-1 refcounts (replace element, replace slice, append, prepend, concat, make sequence, repeat, and of course any form of call). Hence eg:

    if length(filetext[1]) then 
        flag = 1 
    end if 

Whether you can avoid the extra code in such cases is another matter.

Secondly, the beast that is the hidden temp of function return values:

object x, y 
constant MAX = 10000 
atom t0, t1, t2 
function f(object x) return x end function 
t0 = time() 
for i=1 to MAX do 
    x = repeat(1,100000) 
    if length(f(x)) then 
        x = append(x,1) 
    end if 
end for 
t1 = time() 
y = repeat(1,100000) 
for i=1 to MAX do 
    x = repeat(1,100000) 
    if length(f(y)) then 
        x = append(x,1) 
    end if 
end for 
t2 = time() 
printf(1,"with:%3.2fs, without:%3.2f\n",{t1-t0,t2-t1}) 
--if getc(0) then end if 


Much less severe than previous examples, about 6x slower (not at all bad compared to the expected 100,000 times slower!), and as said no impact on any real-world code, just thought you might like to know.

Regards, Pete

new topic     » goto parent     » topic index » view message » categorize

5. Re: Edita on 4.0b3 (r3124)

petelomax said...

Of course I immediately tried something else ("if filetext[1]=filetext[1] then", if you must know) which ran fine on r3132 but gave me problems on Phix. So, I examined your mods to parser.e, which gave me two thoughts:

Phix? Is this you eu implemented in assembly (formerly in Parrot)?

petelomax said...

(NB: this is now firmly in low-priority territory)

First, you may not need the additional code. My analysis (I use different opcodes to you, remember) was that only 8 things create dangerous refcounts (move?, subscript, slice, append, prepend, concat, repeat, and make sequence), and only 8 things "clone" due to non-1 refcounts (replace element, replace slice, append, prepend, concat, make sequence, repeat, and of course any form of call). Hence eg:

    if length(filetext[1]) then 
        flag = 1 
    end if 

Whether you can avoid the extra code in such cases is another matter.

Yes, that's possibly a next place to go. I'd started doing something like this, but the way I'd gone about it was too complex and buggy. So I backtracked to the way things were before, and we get more additional reference counts than we technically need, but don't accidentally miss a place with an op where we didn't normally need it, but did in some circumstances. This becomes especially important when you start using delete routines, which are incredibly useful.

The translator does a bit better on these counts, as it sometimes has a little extra information about what's going on. At least, the reference count is decremented closer to the increment, since it can afford a bit more processing when looking at opcodes.

petelomax said...

Secondly, the beast that is the hidden temp of function return values:

    -- snipped 

Much less severe than previous examples, about 6x slower (not at all bad compared to the expected 100,000 times slower!), and as said no impact on any real-world code, just thought you might like to know.

I don't get slower results at all using svn:3133. Here were my results (both runs had with trace, and the second had without inline):

$ eui func 
with:3.29s, without:3.30 
 
$ eui func 
with:3.28s, without:3.29 

Perhaps a difference with how refcounts are dealt with? Was the 6x with Phix or eu?

Matt

new topic     » goto parent     » topic index » view message » categorize

6. Re: Edita on 4.0b3 (r3124)

mattlewis said...

Phix? Is this your eu implemented in assembly (formerly in Parrot)?

Yup. (windows only, but serves my needs)

mattlewis said...

This becomes especially important when you start using delete routines, which are incredibly useful.

Tell me more. What are delete routines?

mattlewis said...

I don't get slower results at all using svn:3133. Here were my results (both runs had with trace, and the second had without inline):

$ eui func 
with:3.29s, without:3.30 
 
$ eui func 
with:3.28s, without:3.29 

Perhaps a difference with how refcounts are dealt with? Was the 6x with Phix or eu?

Both. Phix is actually 9x, bit slower with the problem, bit faster without, btw. The problem vanishes here under with trace as well. Try it without trace.

Pete

new topic     » goto parent     » topic index » view message » categorize

7. Re: Edita on 4.0b3 (r3124)

petelomax said...
mattlewis said...

This becomes especially important when you start using delete routines, which are incredibly useful.

Tell me more. What are delete routines?

See the documentation for delete_routine() and delete(). Basically, they're a way to add the equivalent of a destructor (to use C++ terms) when a euphoria object is garbage collected. They only apply to atoms represented as doubles (integers are automatically promoted) or sequences. Some built-ins now use them, as well as some library code.

Take a look at allocate() for an example that automatically frees your pointer for you when the value is no longer referenced. open() also does this for you. Basically, you can do RAII in euphoria now. That's the main thing that drove the redesign of the refcount system. The regular expression data created by PCRE when you compile, etc, regular expressions is also released this way.

petelomax said...

Both. Phix is actually 9x, bit slower with the problem, bit faster without, btw. The problem vanishes here under with trace as well. Try it without trace.

Aha. That did it. Also, without inline 'fixes' it as well. Though the slowdown for me is a little less than 2X. Looks like inlined function results need some work.

Matt

new topic     » goto parent     » topic index » view message » categorize

8. Re: Edita on 4.0b3 (r3124)

mattlewis said...

Looks like inlined function results need some work.

svn:3135 fixes this.

Matt

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu