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