Hey,

Here by client I refer about end user MI client like TMF(Trace Compass).

Take the later case. Where a pretty MI output impose drastic performance 
problem.

Some of the problems are internal to TMF but inherent to how java parse XML (in 
compliance with the XML specification). This patch aim to feed a client with a 
minify (web buzzword reference Yay!) XML to minimize the need of manipulation 
on the client side.

The benchmark are currently from TMF and for the interpretation/parsing of 
lttng list -k. In java \t \n and any whitespace between node are considered 
node... so parsing become quite heavy.

Here some graphs: See attached document or here http://imgur.com/Wn78rJV

We can see that even if the problem is how we do it in TMF a minify MI is 
always better and by far when parsing.

We can also compare it to normal output parsing (via regexp) which TMF 
currently use. There seem to have little gain compare to the text version. The 
gain is simply simplicity. The use of regexp is limited(*for must of us) and 
cumbersome.

I tried to see if other utility such as xmllint where affected by whitespace 
etc. but the difference seems minimal.

If a developer need a prettify version of MI output they can use lttng 
<mi_command> | xmllint --format -

Cheers,
Jonathan

On 08/06/2014 10:49 AM, Simon Marchi wrote:
> On 6 August 2014 10:13, Jonathan Rajotte Julien
> <jonathan.r.jul...@gmail.com> wrote:
>> The presence of tabulation and newline in mi is irrelevant and
>> can impact client performance. The parsing & processing of a lot of data 
>> from mi
>> with many /t and /n impact performance. This aim to fix the problem at the
>> source. Style is useless for machine.
> 
> Just by curiosity, did you manage to put a number on that performance impact?
> 
>> Signed-off-by: Jonathan Rajotte Julien <jonathan.r.jul...@gmail.com>
>> ---
>>  src/bin/lttng-sessiond/save.c | 2 +-
>>  src/common/config/config.c    | 8 ++++----
>>  src/common/config/config.h    | 5 ++++-
>>  src/common/mi-lttng.c         | 2 +-
>>  4 files changed, 10 insertions(+), 7 deletions(-)
>>
>> diff --git a/src/bin/lttng-sessiond/save.c b/src/bin/lttng-sessiond/save.c
>> index 90b3a3b..28844e3 100644
>> --- a/src/bin/lttng-sessiond/save.c
>> +++ b/src/bin/lttng-sessiond/save.c
>> @@ -1514,7 +1514,7 @@ int save_session(struct ltt_session *session,
>>         }
>>         file_opened = 1;
>>
>> -       writer = config_writer_create(fd);
>> +       writer = config_writer_create(fd, 1);
>>         if (!writer) {
>>                 ret = LTTNG_ERR_NOMEM;
>>                 goto end;
>> diff --git a/src/common/config/config.c b/src/common/config/config.c
>> index bfb2576..1dccd26 100644
>> --- a/src/common/config/config.c
>> +++ b/src/common/config/config.c
>> @@ -353,7 +353,7 @@ end:
>>  }
>>
>>  LTTNG_HIDDEN
>> -struct config_writer *config_writer_create(int fd_output)
>> +struct config_writer *config_writer_create(int fd_output, int indent)
>>  {
>>         int ret;
>>         struct config_writer *writer;
>> @@ -379,12 +379,12 @@ struct config_writer *config_writer_create(int 
>> fd_output)
>>
>>         ret = xmlTextWriterSetIndentString(writer->writer,
>>                 BAD_CAST config_xml_indent_string);
>> -       if (ret)  {
>> +       if (ret) {
>>                 goto error_destroy;
>>         }
>>
>> -       ret = xmlTextWriterSetIndent(writer->writer, 1);
>> -       if (ret)  {
>> +       ret = xmlTextWriterSetIndent(writer->writer, indent);
>> +       if (ret) {
>>                 goto error_destroy;
>>         }
>>
>> diff --git a/src/common/config/config.h b/src/common/config/config.h
>> index 9a5671a..2fed612 100644
>> --- a/src/common/config/config.h
>> +++ b/src/common/config/config.h
>> @@ -81,11 +81,14 @@ int config_parse_value(const char *value);
>>   * fd_output File to which the XML content must be written. The file will be
>>   * closed once the config_writer has been destroyed.
>>   *
>> + * indent If other than 0 the XML will be pretty printed
>> + * with indentation and newline.
>> + *
>>   * Returns an instance of a configuration writer on success, NULL on
>>   * error.
>>   */
>>  LTTNG_HIDDEN
>> -struct config_writer *config_writer_create(int fd_output);
>> +struct config_writer *config_writer_create(int fd_output, int indent);
>>
>>  /*
>>   * Destroy an instance of a configuration writer.
>> diff --git a/src/common/mi-lttng.c b/src/common/mi-lttng.c
>> index a636c71..31fa610 100644
>> --- a/src/common/mi-lttng.c
>> +++ b/src/common/mi-lttng.c
>> @@ -352,7 +352,7 @@ struct mi_writer *mi_lttng_writer_create(int fd_output, 
>> int mi_output_type)
>>                 goto end;
>>         }
>>         if (mi_output_type == LTTNG_MI_XML) {
>> -               mi_writer->writer = config_writer_create(fd_output);
>> +               mi_writer->writer = config_writer_create(fd_output, 0);
>>                 if (!mi_writer->writer) {
>>                         goto err_destroy;
>>                 }
>> --
>> 2.0.0
>>
>>
>> _______________________________________________
>> lttng-dev mailing list
>> lttng-dev@lists.lttng.org
>> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
> 
> _______________________________________________
> lttng-dev mailing list
> lttng-dev@lists.lttng.org
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
> 

Attachment: performanceMiMinify.ods
Description: application/vnd.oasis.opendocument.spreadsheet

_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to