core: allocate less garbage iterators in Metadata.serialize

Before:
HeadersBenchmark.convertClientHeaders             10  sample   99004   806.749 ±   4.692  ns/op
HeadersBenchmark.convertClientHeaders             20  sample  105673  1540.814 ±  86.361  ns/op
HeadersBenchmark.convertClientHeaders             50  sample  188978  3347.881 ±  71.778  ns/op
HeadersBenchmark.convertClientHeaders            100  sample  189913  6626.884 ±  94.348  ns/op
HeadersBenchmark.convertServerHeaders             10  sample  107884   766.328 ±  49.338  ns/op
HeadersBenchmark.convertServerHeaders             20  sample  122568  1303.501 ±   8.820  ns/op
HeadersBenchmark.convertServerHeaders             50  sample  109281  2920.586 ±  93.654  ns/op
HeadersBenchmark.convertServerHeaders            100  sample  196784  6429.566 ± 108.588  ns/op

After:
HeadersBenchmark.convertClientHeaders             10  sample  113274   715.382 ±  5.412  ns/op
HeadersBenchmark.convertClientHeaders             20  sample  128654  1294.677 ± 67.867  ns/op
HeadersBenchmark.convertClientHeaders             50  sample  112598  2814.925 ± 62.291  ns/op
HeadersBenchmark.convertClientHeaders            100  sample  116920  5383.146 ± 90.205  ns/op
HeadersBenchmark.convertServerHeaders             10  sample  130004   626.243 ±  3.528  ns/op
HeadersBenchmark.convertServerHeaders             20  sample  142054  1185.193 ± 80.272  ns/op
HeadersBenchmark.convertServerHeaders             50  sample  115153  2795.715 ± 92.956  ns/op
HeadersBenchmark.convertServerHeaders            100  sample  119520  5249.636 ± 56.089  ns/op
This commit is contained in:
Carl Mastrangelo 2016-05-25 14:32:11 -07:00
parent 1cc76d8132
commit 4204eb8cd9
1 changed files with 6 additions and 4 deletions

View File

@ -305,10 +305,12 @@ public final class Metadata {
byte[][] serialized = new byte[storeCount * 2][];
int i = 0;
for (Map.Entry<String, List<MetadataEntry>> storeEntry : store.entrySet()) {
for (MetadataEntry metadataEntry : storeEntry.getValue()) {
serialized[i++] = metadataEntry.key != null
? metadataEntry.key.asciiName() : storeEntry.getKey().getBytes(US_ASCII);
serialized[i++] = metadataEntry.getSerialized();
// Foreach allocates an iterator per.
List<MetadataEntry> values = storeEntry.getValue();
for (int k = 0; k < values.size(); k++) {
serialized[i++] = values.get(k).key != null
? values.get(k).key.asciiName() : storeEntry.getKey().getBytes(US_ASCII);
serialized[i++] = values.get(k).getSerialized();
}
}
return serialized;