mina-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Emmanuel Lecharny (JIRA)" <j...@apache.org>
Subject [jira] Commented: (DIRMINA-751) IoBuffer.normalizeCapacity improvement
Date Mon, 07 Dec 2009 22:02:18 GMT

    [ https://issues.apache.org/jira/browse/DIRMINA-751?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12787147#action_12787147
] 

Emmanuel Lecharny commented on DIRMINA-751:
-------------------------------------------

Interesting work :)

I must admit that when I saw your very first patch ( the missing <<20), and had a look
at this atrocious switch I though "man, there should be a way to get this code better and
faster" !. But I was short on time, so I just applied the patch ...

Now, looking at your second patch, I'm wondering if something like :

    protected static int normalizeCapacity( int requestedCapacity ) {
        if (requestedCapacity < 0) {
            return Integer.MAX_VALUE;
        }

        int newCapacity = Integer.highestOneBit(requestedCapacity);
        newCapacity <<= (newCapacity < requestedCapacity ? 1 : 0);
        return (newCapacity < 0 ? Integer.MAX_VALUE : newCapacity);
    } 

would not do the trick in for lines ?

Ar you interested in testing it, and check the kind of performance you get out of it ? On
mu Mac book pro, your test using the old method took 4444ms/5031ms, the new one takes 696ms/668ms,
which represent 6 to 7 times improvments...

Thanks a lot for investigating the code !

Btw, there is some missing part of code in your patch, the 

> IoBuffer.normalizeCapacity improvement
> --------------------------------------
>
>                 Key: DIRMINA-751
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-751
>             Project: MINA
>          Issue Type: Improvement
>          Components: Core
>    Affects Versions: 2.0.0-RC1
>         Environment: N/A
>            Reporter: Bogdan Pistol
>            Priority: Minor
>             Fix For: 2.0.0-RC1
>
>         Attachments: IoBufferTest.java, patch.txt
>
>
> The technique of computing the minimum power of 2 that is bigger than the requestedCapacity
in the org.apache.mina.core.buffer.IoBuffer.normalizeCapacity() is not optimal.
> The current computation is as follows:
>  int newCapacity = 1;
>         while ( newCapacity < requestedCapacity )  {
>             newCapacity <<= 1;
>             if ( newCapacity < 0 )   {
>                 return Integer.MAX_VALUE;
>             }
>         }
> The time complexity of this is O(n), where n is the number of bits of the requestedCapacity
integer, that is log2(requestedCapacity) - maximum 31.
> This creates an unnecessary overhead in some high IoBuffer allocations scenarios that
are calling IoBuffer.normalizeCapacity() a lot when creating IoBuffers. I observed this when
benchmarking a MINA server with hprof.
> There is a better solution to this problem than to iterate the bits from 0 to log2(requestedCapacity).
> The alternative is to use a binary search technique that has optimal time complexity
of O(5). Because requestedCapacity is an integer and has a maximum of 2^5 (32) bits we can
binary search in the set of bits and determine in O(5) comparisons the minimum power of 2
that is bigger than the requestedCapacity.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message