Skip to content

Commit

Permalink
Do not serialize common flags when PRISM_SERIALIZE_ONLY_SEMANTICS_FIE…
Browse files Browse the repository at this point in the history
…LDS is set

* Note that we could shift the flags by 2 on serialize & deserialize
  but it does not seems worth it as it does not save serialized size
  in any significant amount, i.e. average was 0.799 before ruby#2924.
* $ bundle exec rake serialized_size:topgems
Before:
Total sizes for top 100 gems:
total source size:      90207647
total serialized size:  69477115
total serialized/total source: 0.770

Stats of ratio serialized/source per file:
average: 0.844
median:  0.825
1st quartile: 0.597
3rd quartile: 1.064
min - max: 0.078 - 3.792

After:
Total sizes for top 100 gems:
total source size:      90207647
total serialized size:  66150209
total serialized/total source: 0.733

Stats of ratio serialized/source per file:
average: 0.800
median:  0.779
1st quartile: 0.568
3rd quartile: 1.007
min - max: 0.076 - 3.675
  • Loading branch information
eregon committed Jul 24, 2024
1 parent 2cff793 commit cf6334e
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 6 deletions.
2 changes: 1 addition & 1 deletion templates/java/org/prism/Loader.java.erb
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,7 @@ public class Loader {
<%-
params = ["startOffset", "length"]
params << "buffer.getInt()" if node.needs_serialized_length?
params << "loadFlags()"
params << "loadFlags()" if node.flags
params.concat node.semantic_fields.map { |field|
case field
when Prism::Template::NodeField then "#{field.java_cast}loadNode()"
Expand Down
14 changes: 9 additions & 5 deletions templates/java/org/prism/Nodes.java.erb
Original file line number Diff line number Diff line change
Expand Up @@ -94,13 +94,11 @@ public abstract class Nodes {

public final int startOffset;
public final int length;
protected final short flags;
private boolean newLineFlag = false;

public Node(int startOffset, int length, short flags) {
public Node(int startOffset, int length) {
this.startOffset = startOffset;
this.length = length;
this.flags = flags;
}

public final int endOffset() {
Expand Down Expand Up @@ -202,6 +200,9 @@ public abstract class Nodes {
<%- if node.needs_serialized_length? -%>
public final int serializedLength;
<%- end -%>
<%- if node.flags -%>
public final short flags;
<%- end -%>
<%- node.semantic_fields.each do |field| -%>
<%- if field.comment -%>
/**
Expand All @@ -224,14 +225,17 @@ public abstract class Nodes {
<%-
params = ["int startOffset", "int length"]
params << "int serializedLength" if node.needs_serialized_length?
params << "short flags"
params << "short flags" if node.flags
params.concat(node.semantic_fields.map { |field| "#{field.java_type} #{field.name}" })
-%>
public <%= node.name -%>(<%= params.join(", ") %>) {
super(startOffset, length, flags);
super(startOffset, length);
<%- if node.needs_serialized_length? -%>
this.serializedLength = serializedLength;
<%- end -%>
<%- if node.flags -%>
this.flags = flags;
<%- end -%>
<%- node.semantic_fields.each do |field| -%>
this.<%= field.name %> = <%= field.name %>;
<%- end -%>
Expand Down
2 changes: 2 additions & 0 deletions templates/src/serialize.c.erb
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,9 @@ pm_serialize_node(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer) {
size_t length_offset = buffer->length;
pm_buffer_append_string(buffer, "\0\0\0\0", 4); /* consume 4 bytes, updated below */
<%- end -%>
<%- unless Prism::Template::SERIALIZE_ONLY_SEMANTICS_FIELDS && !node.flags -%>
pm_buffer_append_varuint(buffer, (uint32_t) node->flags);
<%- end -%>
<%- node.fields.each do |field| -%>
<%- case field -%>
<%- when Prism::Template::NodeField -%>
Expand Down

0 comments on commit cf6334e

Please sign in to comment.