- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在重构我几年前以类似 FORTRAN 的风格编写的一次性代码。大多数代码现在更有组织性和可读性。然而,该算法的核心(对性能至关重要)使用一维和二维 Java 数组,其典型代表是:
for (int j = 1; j < len[1]+1; j++) {
int jj = (cont == BY_TYPE) ? seq[1][j-1] : j-1;
for (int i = 1; i < len[0]+1; i++) {
matrix[i][j] = matrix[i-1][j] + gap;
double m = matrix[i][j-1] + gap;
if (m > matrix[i][j]) {
matrix[i][j] = m;
pointers[i][j] = UP;
}
//...
}
}
为了清晰、可维护性和与其余代码的接口(interface),我想重构它。然而在阅读Java Generics Syntax for arrays和 Java Generics and number s 我有以下问题:
性能。该代码计划使用大约 10^8 - 10^9 秒/年,这几乎是可管理的。我的阅读表明,将 double 更改为 Double 有时可以将性能提高 3 倍。我想要其他经验。我还希望从 foo[] 转移到 List 也会很成功。我没有第一手知识,再次经验会很有用。
数组绑定(bind)检查。这在 double[] 和 List 中有不同的处理方式吗?这有关系吗?我预计有些问题会越界,因为该算法相当简单并且只应用于少数数据集。
如果我不进行重构,那么代码就会混合使用这两种方法,造成丑陋且可能很脆弱。我已经在尝试编写诸如以下内容:
列表
并了解删除并不能使它变得漂亮,充其量只会引起编译器警告。如果没有非常复杂的结构,似乎很难做到这一点。
SUMMARY 目前的共识:
与原始数组相比,集合具有显着的性能下降,尤其是对于矩阵等构造。这是在自动(取消)装箱数字和访问列表项时发生的
对于严格的数值(科学)算法,数组符号 [][] 实际上更易于阅读,但变量的命名应尽可能有帮助
泛型和数组不能很好地结合。将数组包装在类中以将它们传输进/出紧密算法可能很有用。
做出改变的客观原因很少
问题 @SeanOwen 建议将常量值从循环中取出会很有用。假设我没有搞砸这看起来像:
int len1 = len[1];
int len0 = len[0];
int seq1 = seq[1];
int[] pointersi;
double[] matrixi;
for (int i = 1; i < len0+1; i++) {
matrixi = matrix[i];
pointersi = pointers[i];
}
for (int j = 1; j < len1+1; j++) {
int jj = (cont == BY_TYPE) ? seq1[j-1] : j-1;
for (int i = 1; i < len0+1; i++) {
matrixi[j] = matrixi[j] + gap;
double m = matrixi[j-1] + gap;
if (m > matrixi[j]) {
matrixi[j] = m;
pointersi[j] = UP;
}
//...
}
}
我认为编译器应该很聪明地做这类事情。我们还需要这样做吗?
最佳答案
我读了 Kent Beck 写的一本关于编码最佳实践的好书 (http://www.amazon.com/Implementation-Patterns/dp/B000XPRRVM)。还有一些有趣的性能数据。具体来说,数组和各种集合之间有比较,数组确实快得多(与 ArrayList 相比可能是 x3)。
此外,如果您使用 Double 而不是 double,则需要坚持使用,不要使用 double,因为自动(取消)装箱会降低您的表现。
考虑到您的性能需求,我会坚持使用基本类型数组。
更重要的是,对于循环中的条件,我会只计算一次上限。这通常在循环之前的行中完成。
但是,如果您不喜欢仅在循环中使用的上限变量可在循环外访问,您可以像这样利用 for 循环的初始化阶段:
for (int i=0, max=list.size(); i<max; i++) {
// do something
}
我不相信 Java 中的数组会过时。对于性能关键循环,我看不到任何语言设计者取消最快的选择(尤其是当差异是 x3 时)。
我理解您对可维护性以及与应用程序其余部分的一致性的关注。但我相信关键循环有权进行一些特殊实践。
我会尝试在不更改代码的情况下使代码尽可能清晰:
private final
,它们在运行时内联的可能性非常大(因为它们很短),因此在运行时不会对性能产生影响。关于java - 将 Java 数组和基元 (double[][]) 重构为集合和泛型 (List<List<Double>>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1409432/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!