I investigated network loading and found that a big part of internal data
inside messages is `GridLongList`.
It is a part of `GridDhtTxFinishRequest`,
`GridDhtAtomicDeferredUpdateResponse`, `GridDhtAtomicUpdateRequest`,
`GridNearAtomicFullUpdateRequest` and `NearCacheUpdates`.
So I think it has the sense to optimize `GridLongList` serialization.
Here we serialize all elements and don't take into account `idx` value:
```
@Override public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
writer.setBuffer(buf);
if (!writer.isHeaderWritten()) {
if (!writer.writeHeader(directType(), fieldsCount()))
return false;
writer.onHeaderWritten();
}
switch (writer.state()) {
case 0:
if (!writer.writeLongArray("arr", arr))
return false;
writer.incrementState();
case 1:
if (!writer.writeInt("idx", idx))
return false;
writer.incrementState();
}
return true;
}
```
Which is not happening in another serialization method in the same class:
```
public static void writeTo(DataOutput out, @Nullable GridLongList list)
throws IOException {
out.writeInt(list != null ? list.idx : -1);
if (list != null) {
for (int i = 0; i < list.idx; i++)
out.writeLong(list.arr[i]);
}
}
```
So, we can simply reduce messages size by sending only a valuable part of
the array.
If you don't mind I will create an issue in Jira for this.
By the way, `long` is a huge type. As I see in most cases `GridLongList`
uses for counters.
And I have checked the possibility of compress `long` into smaller types as
`int`, `short` or `byte` in test
`GridCacheInterceptorAtomicRebalanceTest` (took it by random).
And found out that all `long` in`GridLongList` can be cast to `int` and 70%
of them to shorts.
Such conversion is quite fast about 1.1 (ns) per element (I have checked it
by JMH test).
Of course, there are a lot of ways to compress data,
but I know proprietary GridGain plug-in has different `MessageWriter`
implementation.
So maybe it is unnecessary and some compression already exists in this
proprietary plug-in.
Does someone know something about it?