You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Nikolay Izhikov (Jira)" <ji...@apache.org> on 2026/09/04 08:28:00 UTC

[jira] [Commented] (IGNITE-27088) BinaryWriter should use internal String#value

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

Nikolay Izhikov commented on IGNITE-27088:
------------------------------------------

{code}
Benchmark                                                     (content)  (len)  (zeroCopy)  Mode  Cnt     Score    Error   Units
JmhBinaryStringWriteBenchmark.writeString                         ascii      8        true  avgt    5     3.351 ±  0.398   ns/op
JmhBinaryStringWriteBenchmark.writeString                         ascii      8       false  avgt    5     5.853 ±  0.036   ns/op
JmhBinaryStringWriteBenchmark.writeString                         ascii     64        true  avgt    5     5.332 ±  0.037   ns/op
JmhBinaryStringWriteBenchmark.writeString                         ascii     64       false  avgt    5    16.338 ±  0.125   ns/op
JmhBinaryStringWriteBenchmark.writeString                         ascii    512        true  avgt    5    14.394 ±  0.124   ns/op
JmhBinaryStringWriteBenchmark.writeString                         ascii    512       false  avgt    5   105.519 ±  0.930   ns/op
JmhBinaryStringWriteBenchmark.writeString                         ascii   4096        true  avgt    5   101.396 ±  0.417   ns/op
JmhBinaryStringWriteBenchmark.writeString                         ascii   4096       false  avgt    5   768.706 ±  6.367   ns/op
JmhBinaryStringWriteBenchmark.writeString                        latin1      8        true  avgt    5     5.109 ±  1.585   ns/op
JmhBinaryStringWriteBenchmark.writeString                        latin1      8       false  avgt    5     6.968 ±  0.034   ns/op
JmhBinaryStringWriteBenchmark.writeString                        latin1     64        true  avgt    5    22.666 ±  0.217   ns/op
JmhBinaryStringWriteBenchmark.writeString                        latin1     64       false  avgt    5    23.769 ±  0.325   ns/op
JmhBinaryStringWriteBenchmark.writeString                        latin1    512        true  avgt    5   146.144 ±  0.636   ns/op
JmhBinaryStringWriteBenchmark.writeString                        latin1    512       false  avgt    5   173.865 ±  1.870   ns/op
JmhBinaryStringWriteBenchmark.writeString                        latin1   4096        true  avgt    5  1119.946 ±  4.887   ns/op
JmhBinaryStringWriteBenchmark.writeString                        latin1   4096       false  avgt    5  1351.368 ± 11.461   ns/op
JmhBinaryStringWriteBenchmark.writeString                      cyrillic      8        true  avgt    5     7.605 ±  0.060   ns/op
JmhBinaryStringWriteBenchmark.writeString                      cyrillic      8       false  avgt    5     7.631 ±  0.458   ns/op
JmhBinaryStringWriteBenchmark.writeString                      cyrillic     64        true  avgt    5    26.330 ±  0.044   ns/op
JmhBinaryStringWriteBenchmark.writeString                      cyrillic     64       false  avgt    5    26.287 ±  0.047   ns/op
JmhBinaryStringWriteBenchmark.writeString                      cyrillic    512        true  avgt    5   180.104 ±  0.331   ns/op
JmhBinaryStringWriteBenchmark.writeString                      cyrillic    512       false  avgt    5   179.614 ±  0.304   ns/op
JmhBinaryStringWriteBenchmark.writeString                      cyrillic   4096        true  avgt    5  1426.047 ±  6.374   ns/op
JmhBinaryStringWriteBenchmark.writeString                      cyrillic   4096       false  avgt    5  1417.477 ±  6.662   ns/op
JmhBinaryStringWriteBenchmark.writeString                         mixed      8        true  avgt    5    10.335 ±  0.019   ns/op
JmhBinaryStringWriteBenchmark.writeString                         mixed      8       false  avgt    5    10.734 ±  1.046   ns/op
JmhBinaryStringWriteBenchmark.writeString                         mixed     64        true  avgt    5    62.831 ±  2.138   ns/op
JmhBinaryStringWriteBenchmark.writeString                         mixed     64       false  avgt    5    64.942 ± 12.633   ns/op
JmhBinaryStringWriteBenchmark.writeString                         mixed    512        true  avgt    5   460.263 ±  1.085   ns/op
JmhBinaryStringWriteBenchmark.writeString                         mixed    512       false  avgt    5   483.108 ±  2.195   ns/op
JmhBinaryStringWriteBenchmark.writeString                         mixed   4096        true  avgt    5  3826.769 ± 19.541   ns/op
JmhBinaryStringWriteBenchmark.writeString                         mixed   4096       false  avgt    5  3839.145 ± 65.522   ns/op
{code}

> BinaryWriter should use internal String#value 
> ----------------------------------------------
>
>                 Key: IGNITE-27088
>                 URL: https://issues.apache.org/jira/browse/IGNITE-27088
>             Project: Ignite
>          Issue Type: Improvement
>            Reporter: Maksim Timonin
>            Assignee: Nikolay Izhikov
>            Priority: Major
>              Labels: ise
>         Attachments: WritingBigMapReproducer.java
>
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> While writing Strings in BinaryWriter we call BinaryWriterExImpl#writeString, that calls String#getBytes. 
> Last call creates a copy of internal String#value byte array. Java does it intentionally, to avoid scenario when this array will be changed. 
> But writing a lot of strings leads to useless heap usage for creating such copies. Actually we can get this array using Unsafe/Reflection to optimize String writings.
> This change should be done carefully, because String.getBytes also provides encoding, and this behavior must be taken into account.
> Example of writeString/writeByteArray in attach



--
This message was sent by Atlassian Jira
(v8.20.10#820010)