提高网络编码编码的性能

我目前正在开发一个基于Java的网络编码库(http://en.wikipedia.org/wiki/Network_coding)。 这是CPU密集型的,因此需要一些优化编码阶段的帮助。 我实际上在做的是,我正在创建原始数据的随机线性组合,其中加法是XOR,乘法是伽罗瓦域乘法(在GF(2 ^ 16)中)。

我已经尽我所能进行优化了。 例如,我使用这样的技巧: http : //groups.google.com/group/comp.dsp/browse_thread/thread/cba57ae9db9971fd/7cd21eec39ddae1a?hl=en&lnk=gst&q=Sarwate+Galois#7cd21eec39ddae1a使乘法更快。

因此,我正在寻找有关如何进一步优化此方法的提示。 由于我使用的分析器没有给出任何关于哪个操作最昂贵的提示(例如,它是数组查找还是XOR),因此很难描述。 因此,我正在随意尝试不同的想法并测试它是否能提高整体性能。

更具体地说,我需要帮助的一些潜在改进领域是:

  • 如何确保Java可以跳过对数组操作的边界检查?
  • 如何在HotSpot优化完成后检索实际执行的字节码?

这是算法的核心。 可能很难理解脱离背景,但如果你看到我正在做的任何不必要的昂贵操作,请告诉我!

int messageFragmentStart = 0; int messageFragmentEnd = fragmentCharSize; int coefficientIndex = fragmentID * messageFragmentsPerDataBlock; final int resultArrayIndexStart = fragmentID * fragmentCharSize; for (int messageFragmentIndex = 0; messageFragmentIndex < messageFragmentsPerDataBlock; messageFragmentIndex++) { final int coefficientLogValue = coefficientLogValues[coefficientIndex++]; int resultArrayIndex = resultArrayIndexStart; for (int i = messageFragmentStart; i < messageFragmentEnd; i++) { final int logSum = coefficientLogValue + logOfDataToEncode[i]; final int messageMultipliedByCoefficient = expTable[logSum]; resultArray[resultArrayIndex++] ^= messageMultipliedByCoefficient; } messageFragmentStart += fragmentCharSize; messageFragmentEnd = Math.min(messageFragmentEnd + fragmentCharSize, maxTotalLength); } 

你不能让Java放弃在JLS中指定的边界检查。 但是在大多数情况下,只要边界检查很简单(例如i < array.length ),JIT就能够避免这种情况 - 如果没有,就没有办法避免它(我认为可以使用不安全的对象?)。

对于你的第二个问题,这里有这个应该达到目的就好了。

但无论如何,从你的代码来看,似乎这个问题对于向量化来说是微不足道的,可悲的是JVM并不是很擅长它/它根本就没有。 因此,使用编译内在函数在c / c ++中实现相同的代码(你甚至可以尝试ICC / GCC的自动矢量化)可能会导致一些非常明显的加速 - 假设我们没有完全受内存限制。 所以我用C ++实现它并使用JNI作为参考。