为什么Google ProtoBuf的性能会逐渐提升

时间:2015-02-03 21:00:36

标签: java protocol-buffers

我是Google ProtoBuf的新手。我注意到的一件事是,随着编码/解码数量的增加,ProtoBuf的性能逐渐提高。

我有一个用Java编写的测试,它对一个类进行编码并立即对其进行解码。对同一类进行编码/解码1000次。

所花费的时间如下,第一个数字是编码所用的时间,第二个数字是解码所用的时间,以微秒为单位。

 Proto: 886 , 993
 Proto: 888 , 997
 Proto: 850 , 1016
 Proto: 861 , 998
 Proto: 851 , 1055
 ......
 ......
 Proto: 469 , 545
 Proto: 469 , 555
 Proto: 403 , 612
 Proto: 421 , 713
 Proto: 374 , 535
 ......
 ......
 Proto: 186 , 477
 Proto: 189 , 473
 Proto: 186 , 476
 Proto: 186 , 700
 Proto: 190 , 483
 Proto: 194 , 464
 Proto: 186 , 397
 .......
 .......
 Proto: 110 , 135
 Proto: 107 , 125
 Proto: 115 , 134
 Proto: 111 , 142
 Proto: 131 , 136
 Proto: 108 , 124
 .......
 .......
 Proto: 82 , 107
 Proto: 79 , 100
 Proto: 78 , 100
 Proto: 85 , 101
 Proto: 69 , 68
 Proto: 67 , 66

 ......
 ......

 Proto: 73 , 69
 Proto: 71 , 69
 Proto: 85 , 83
 Proto: 73 , 68
 Proto: 74 , 72
 Proto: 74 , 68
 Proto: 71 , 68
 Proto: 71 , 76
 Proto: 72 , 68
 ......
 ......

 Proto: 33 , 28
 Proto: 34 , 28
 Proto: 47 , 32
 Proto: 35 , 28
 Proto: 33 , 28
 Proto: 34 , 29
 ......
 ......
 Proto: 36 , 45
 Proto: 44 , 29
 Proto: 34 , 28
 Proto: 34 , 28

这些测试都是独立的。我在想:

  1. ProtoBuf如何处理这个以及为什么它会逐渐提高性能?
  2. 为什么它一开始没有达到最佳状态?
  3. 如何调整ProtoBuf以使其从一开始就达到最佳性能?
  4. 非常感谢。

1 个答案:

答案 0 :(得分:1)

这是Java的典型:作为虚拟机的一部分,JIT(即时)编译器优化了广泛运行的代码,并且可以稳定地应用更详细的优化作为代码获得更多运行,VM可以更多地了解代码在实践中的行为方式。例如,如果List变量几乎总是ArrayList,那么JVM可以优化以在这种情况下表现最佳。

实际上没有办法改变这种情况:编译器无法提前确定一个if条件是否比另一个更可能,以及JIT需要确定如何最佳地优化您的其他条件代码。