Tag: optimization

提高网络编码编码的性能

我目前正在开发一个基于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 […]

Java for循环优化

我用java for循环做了一些运行时测试,并发现了一个奇怪的行为。 对于我的代码,我需要原始类型的包装器对象,如int,double等,以模拟io和输出参数,但这不是重点。 只需看我的代码。 具有字段访问权限的对象如何比原始类型更快? 具有prtimitive类型的for循环: public static void main(String[] args) { double max = 1000; for (int j = 1; j < 8; j++) { double i; max = max * 10; long start = System.nanoTime(); for (i = 0; i < max; i++) { } long end = System.nanoTime(); long microseconds = (end […]

为什么边界检查不会被消除?

我写了一个简单的基准测试 ,以便找出当通过按位和数组计算数组时是否可以消除边界检查。 这基本上就是几乎所有哈希表的作用:它们计算 h & (table.length – 1) 作为table的索引,其中h是hashCode或派生值。 结果表明边界检查不会被消除。 我的基准测试的想法很简单:计算两个值i和j ,其中两个值都保证是有效的数组索引。 i是循环计数器。 当它被用作数组索引时,边界检查被消除。 j计算为x & (table.length – 1) ,其中x是每次迭代时改变的某个值。 当它被用作数组索引时,边界检查不会被消除。 相关部分如下: for (int i=0; i<=table.length-1; ++i) { x += result; final int j = x & (table.length-1); result ^= i + table[j]; } 另一个实验使用 result ^= table[i] + j; 代替。 时间的差异可能是15%(在我尝试的不同变体中非常一致)。 我的问题: 除了绑定检查消除之外还有其他可能的原因吗? 是否有一些复杂的原因我无法理解为什么j没有绑定检查消除? […]