提高网络编码编码的性能

时间:2011-10-12 08:53:17

标签: java optimization jvm profiler

我目前正在开发一个基于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);
}

1 个答案:

答案 0 :(得分:2)

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

对于你的第二个问题,this这里应该可以很好地达到目的。

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