java - 提高网络编码-编码的性能

标签 java optimization jvm profiler

我目前正在开发一个基于 Java 的网络编码库 (http://en.wikipedia.org/wiki/Network_coding)。这是非常占用 CPU 资源的,因此需要一些帮助来优化编码阶段。我实际上是在创建原始数据的随机线性组合,其中加法是异或,乘法是伽罗华域乘法(在 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 就能够避免这种情况——如果不是这样,就没有办法避免这种情况(好吧,我假设有人可以玩不安全的对象?)。

对于你的第二个问题,有 this在这里应该可以很好地实现目的。

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

关于java - 提高网络编码-编码的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7737488/

相关文章:

language-agnostic - 红黑树是我理想的数据结构吗?

java - 在 Java 中运行时省略实例字段

java - 冒泡排序字符串数组

java - 除了维基百科页面上列出的那个,还有其他 Java quines 吗?

mysql - 为什么使用 CHAR/VARCHAR 索引时 MySQL 查询的性能如此糟糕?

performance - 在 VB6 中计时功能/测量性能的最佳方法是什么?

java - 如何从我拥有的对象中获取变量?

java - 从 JFileChooser 获取用户输入的文件名

java - 在 HP-UX 环境 JVM 中,C 堆与 Java 堆中运行的是什么?

java - 如何减少jvm使用的线程数