[ 
https://issues.apache.org/jira/browse/QPID-8245?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16627756#comment-16627756
 ] 

Rob Godfrey commented on QPID-8245:
-----------------------------------

[~alex.rufous] My assumption is that it will be quicker to "skip" than to 
decode a value, and that the only time on the critical path where 
get(<propertyname>) will ever be called will be on the filtering code, and that 
in all other cases (such as converting a message to a different protocol, or 
displaying the headers in the console) we can ignore the overhead of completely 
re-decoding... so the code would look something like this:

{code}
private static final Object NOT_PRESENT = new Object();

public Object get(String key)
{
    Object value = _cached.get(key);
    if(value == null)
    {
        value = findValueForKey(key);
        _cached.putIfAbsent(key, value);
    }
    return value == NOT_PRESENT ? null : value;
}

private Object findValueForKey(key)
{
    AMQShortString keyAsShortString = AMQShortString.valueOf(key);
    QpidByteBuffer dup = _encodedForm.duplicate();
    while(dup.hasRemaining())
    {
        if(nextKeyEquals(dup, keyAsShortString)
        {
            AMQTypedValue value = AMQTypedValue.readFromBuffer(slice);
            return value.getValue();
        }
        else
        {
            skipValue(dup);
        }
    }
    return NOT_PRESENT;
}
{code}

> [Broker-J] [AMQP 0-8..0-91] Decode FiledTable fields on demand
> --------------------------------------------------------------
>
>                 Key: QPID-8245
>                 URL: https://issues.apache.org/jira/browse/QPID-8245
>             Project: Qpid
>          Issue Type: Improvement
>          Components: Broker-J
>    Affects Versions: qpid-java-broker-7.1.0
>            Reporter: Alex Rudyy
>            Priority: Major
>             Fix For: qpid-java-broker-7.1.0
>
>         Attachments: 
> 0001-QPID-8245-Broker-J-Stop-rellocating-message-headers-.patch, 
> 0002-QPID-8245-Add-factory-methods-to-create-field-table-.patch, 
> 0003-QPID-8245-Remove-FiledTable-setters-methods-modifyin.patch, 
> 0004-QPID-8245-Decode-field-table-properties-when-require.patch, 
> 0005-QPID-8245-Remove-methods-getXXX-in-order-to-simplify.patch, 
> 0005-QPID-8245-Split-field-table-into-2-implementations.patch
>
>
> At the moment all field table properties are decoded when decode 
> functionality is invoked. For use cases when only some of the field table 
> properties are queried, the decoding functionality can be changed to stop 
> decoding on getting the requested property. Potentially, such approach can 
> improve the performance of routing transient messages when destinations are 
> bound to the routing exchange using selector filters. As filter expression 
> contains only some properties, the decoding of message headers can be stopped 
> on getting all fields specified in selector expression.
> The idea is illustrated by Rob Godfrey on 
> [QPID-8238|https://issues.apache.org/jira/browse/QPID-8238?focusedCommentId=16601936&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-16601936]



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org
For additional commands, e-mail: dev-h...@qpid.apache.org

Reply via email to