You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ignite.apache.org by "Vladimir Ozerov (JIRA)" <ji...@apache.org> on 2015/09/24 09:44:04 UTC

[jira] [Created] (IGNITE-1539) Marshaller performance micro-optimizations.

Vladimir Ozerov created IGNITE-1539:
---------------------------------------

             Summary: Marshaller performance micro-optimizations.
                 Key: IGNITE-1539
                 URL: https://issues.apache.org/jira/browse/IGNITE-1539
             Project: Ignite
          Issue Type: Task
          Components: general
    Affects Versions: 1.1.4
            Reporter: Vladimir Ozerov
             Fix For: ignite-1.5


The main goal of marshalling is to write an object to byte[]/ByteBuffer, or read from it. Currently each read/write is surrounded by quite a few additional actions which can be avoided either in general, or in some specific cases.

Looks like we can apply lots of micro-optimizations to our marshallers:
1) Do not perform HashMap lookups for each field ID.
2) Pre-calculate field IDs for reflection-based types.
3) Pre-calculate metadata for reflection-based types and do not track it.
4) Avoid "raw" mode checks for reflection-based types.
5) Merge small writes into bigger ones where possible. E.g. WRITE_INT_FIELD_ID + WRITE_INT_FIELD_LEN can be replaced with a single WRITE_LONG when field length is constant.
6) Memory bounds checks can be avoided in lots cases if we read/write object part with pre-defined length.
7) For objects having only fixed-length fields, we can pre-calculate a kind of template seriously minimizing writes.
8) Anything else?

Applying some of these optimizations in .Net shows very promising results with up to 40% throughput increase.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)