Java 提高网络编码性能

Java 提高网络编码性能,java,optimization,jvm,profiler,Java,Optimization,Jvm,Profiler,我目前正在开发一个基于Java的网络编码库(http://en.wikipedia.org/wiki/Network_coding). 这是非常CPU密集型的,因此需要一些帮助来优化编码阶段。我基本上是在创建原始数据的随机线性组合,其中加法是XOR,乘法是伽罗瓦域乘法(在GF(2^16)中) 我已经尽我所能进行了优化。例如,我使用这样的技巧:使乘法更快 因此,我正在寻找如何进一步优化的技巧。这很难分析,因为我使用的分析器没有给你任何关于哪个操作最昂贵的提示(例如,是数组查找还是XOR)。因此,我

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

我已经尽我所能进行了优化。例如,我使用这样的技巧:使乘法更快

因此,我正在寻找如何进一步优化的技巧。这很难分析,因为我使用的分析器没有给你任何关于哪个操作最昂贵的提示(例如,是数组查找还是XOR)。因此,我正处于随机尝试不同想法并测试其是否能提高整体性能的阶段

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

  • 如何确保Java可以跳过数组操作的边界检查
  • 如何检索热点完成优化后实际执行的字节码
这是算法的核心。断章取义可能很难理解,但如果您看到我正在进行的任何不必要的昂贵操作,请让我知道

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);
}
int messageFragmentStart=0;
int messageFragmentEnd=fragmentCharSize;
int coefficientIndex=fragmentID*messageFragmentsPerDataBlock;
final int resultarayindexstart=fragmentID*fragmentCharSize;
对于(int-messageFragmentIndex=0;messageFragmentIndex
您不能让Java放弃JLS中指定的边界检查。但在大多数情况下,只要边界检查很简单(例如
i
),JIT就能够避免这种情况-如果不是,就没有办法避免(我假设可以使用不安全的对象?)

对于你的第二个问题,这里有一个应该很好地满足目的的问题


但无论如何,从您的代码来看,这个问题似乎很容易矢量化,可悲的是JVM根本不擅长/根本不擅长矢量化。因此,使用编译内部函数在c/c++中实现相同的代码(您甚至可以尝试ICC/GCC的自动矢量化)可能会导致一些非常明显的加速——假设我们没有完全的内存限制。所以我将在C++中实现它,并使用JNI作为参考。我尝试使用PrintAssembly,但收到以下错误消息:“无法加载hsdis-amd64.dll;库不可加载;PrintAssembly已禁用”。知道我在哪里可以得到这个dll吗?没关系。我改为JDK 7(x86),并在上找到了它的dll。