Tag: 性能

使用自定义比较器时,使用TreeSet或ArrayList是否更好?

我已经实现了一个图表。 我想根据它们的度数对给定的顶点子集进行排序。 因此,我编写了一个名为DegreeComparator的自定义比较器。 private class DegreeComparator implements Comparator { @Override public int compare(Integer arg0, Integer arg1) { if(adj[arg1].size() == adj[arg0].size()) return arg1 – arg0; else return adj[arg1].size() – adj[arg0].size()); } } 那么,下面哪一个更有效率? 使用TreeSet public Collection sort(Collection unsorted) { Set sorted = new TreeSet(new DegreeComparator()); sorted.addAll(unsorted); return sorted; } 使用ArrayList Collections.sort(unsorted, new DegreeComparator()); 请注意,第二种方法不是函数,而是单行代码。 直观地说,我宁愿选择第二个。 但我不确定它是否更有效率。

在Java中编写“exception驱动开发”的性能成本?

通过在Java中创建,抛出和捕获exception,是否有任何性能成本? 我计划将“exception驱动的开发”添加到一个更大的项目中。 我想设计自己的exception并将它们包含在我的方法中,迫使开发人员捕获并做适当的工作。 例如,如果您有一种方法可以根据名称从数据库中获取用户。 public User getUser(String name); 但是,用户可能为null,并且在使用User的公共方法之前忘记检查这一点很常见。 User user = getUser(“adam”); int age = user.getAge(); 这将导致NullPointerException和崩溃。 但是,如果我在返回user-object之前进行了检查,如果它为null并抛出’UserIsNullException’: public User getUser(String name) throws UserIsNullException; 我强迫实施者思考和行动: try { User user = getUser(“adam”); int age = user.getAge(); }catch( UserIsNullException e) { } 它使代码更安全地发生意外崩溃并消除更多错误。 假设该网站每小时有数百名访问者,这种设计模式几乎无处不在。 这样的设计方法将如何影响性能? 这些好处是否会超过成本,还是只是简单的编码? 谢谢你的帮助! UPDATE! 要清楚,我的注意力不是包装NullPointerException,正如我的例子所暗示的那样。 目标是强制实施者编写try / catch,从而避免真正崩溃的头痛: user == null 被遗忘了。 […]

再一次在字符串附加vs concat vs +

可能是我分裂头发,但我想知道以下情况: String newString = a + b + c; //case 1 String newString = a.concat(b).concat(c); //case 2 StringBuilder newString = new StringBuilder(); //case 3 newString.append(a); newString.append(b); newString.append(c); 哪个最好用? 我最好的意思是任何方式 。 阅读这些,其他post说案例3不是最佳表现明智,其他案例1最终将在案例3等。 更具体。 例如,将所有设置放在一边,如果你不得不维护他的代码,哪种风格更适合从另一个程序员那里看到它? 或者您认为哪种编程效率更高? 或者你会认为更快等等。 我不知道怎么表达这个。 像案例3这样的答案可能会更快,但绝大多数程序员更喜欢案例1,因为如果它在某种程度上得到了很好的阐述,它也是最可读的

Java性能 – 用于大量快速读取的ArrayLists与Arrays

我有一个程序,我需要在尽可能短的时间内(以毫秒为单位)对类似List的对象进行100,000到1,000,000次随机读取读取,以用于类似细胞自动机的程序。 我认为我正在使用的更新算法已经过优化(有效跟踪活动单元等)。 列表确实需要改变大小,但性能并不重要。 所以我想知道使用Arrays而不是ArrayLists的性能是否足以在如此短的时间内处理那么多读取时产生差异。 目前,我正在使用ArrayLists。 编辑:我忘了提到:我只是存储整数,所以另一个因素是使用Integer包装类(在ArrayLists的情况下)与int(在数组的情况下)。 有没有人知道使用ArrayList实际上是否需要3个指针查找(一个用于ArrayList,一个用于底层数组,一个用于Integer-> int),因为数组只需要1(数组地址+偏移到特定的INT)? HotSpot会优化额外的外观吗? 这些额外的观察有多重要? Edit2:另外,我忘了提到我还需要进行随机访问写入(写入,而不是插入)。

对慢速编译进行故障排除

我应该怎么做才能调查和解决慢速编译问题 ? 我的项目有大约100个类,编译时间超过45秒,这对我来说似乎很慢。 作为参考,我有另外一个项目有50个类,在3秒内编译。 PS: 我使用maven作为构建工具。 编译需要大约50秒( mvn clean compile ),其中45秒用于运行javac(通过使用-X选项运行确认)。 增加内存量没有帮助( -Xms500m ) 我可以提供有关我的项目的更多信息,但它是相当标准的,所以我不确定哪些信息是相关的。 UPDATE 感谢Tagir的想法,我找到了其中一个罪魁祸首。 该类为编译时间增加了20秒: import org.jooq.DSLContext; import org.jooq.Field; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.round; import static org.jooq.impl.DSL.sum; class Test { static Object fast(DSLContext sql) { Field a = field(“a”).cast(Double.class); return sql.select() .having(round(sum(a).cast(Double.class), 2).ne(0d)); } static Object slow(DSLContext sql) { return sql.select() […]

Java中的快速sqrt以牺牲精度为代价

我正在寻找Java中的快速平方根实现,用于输入范围为[0,2 * 10 ^ 12]的双值。 对于此范围内的任何值,精度应小于5位小数。 换句话说,结果可能与5个小数位后的Math.sqrt()方法不同。 但是,此方法需要比Math.sqrt()快得多。 有任何想法吗? 谢谢!

charAt()或子串? 哪个更快?

我想遍历String中的每个字符,并将String的每个字符作为String传递给另一个函数。 String s = “abcdefg”; for(int i = 0; i < s.length(); i++){ newFunction(s.substring(i, i+1));} 要么 String s = “abcdefg”; for(int i = 0; i < s.length(); i++){ newFunction(Character.toString(s.charAt(i)));} 最终结果必须是String。 那么任何更快或更高效的想法?

如何从代码库中删除System.out.println

我们有一个庞大的(旧的遗留Java)代码库,其中许多文件(大约5k)都有System.out.println。 我们计划因清理/性能原因删除它们。 我们如何编写一个脚本来替换它们而不会在代码中引入任何问题? 脚本不能盲目删除它们,因为以下情况可能是一个问题: if () some.code… else System.out.println(…); DB.close(); 我想用’;’代替它们。 这将照顾上述情况。 你还有其他问题吗? 还有其他建议吗?

测试tic tac toe win条件

我正在寻找最有效的java方法来测试是否有人赢得了tic tac toe。 数据是二维数组,如此…… char[][] ticTacToe = {{‘X’,’ ‘,’O’}, {‘O’,’X’,’O’}, {‘X’,’ ‘,’X’},}; 我知道这不是初始化数组的专业方法,但我只是在这里测试。 我现在能做的最好的是一个详尽的if / else树。 这是其中一棵树…… if (ticTacToe[1][1] == ‘X’){ if (ticTacToe[0][0] == ‘X’){ if (ticTacToe[2][2] == ‘X’){ System.out.println(“X wins”); } } else if (ticTacToe[0][1] == ‘X’){ if (ticTacToe[2][1] == ‘X’){ System.out.println(“X wins”); } } else if (ticTacToe[1][0] == ‘X’){ if (ticTacToe[1][2] == ‘X’){ […]

Java监视器有多重?

假设我有一个包含数千个对象的数组,以及可能访问每个对象的少量线程。 我想保护对其中一个对象方法的访问。 最简单的方法是将该方法声明为synchronized 。 但是,这可能会导致创建数千个监视器,无论它们实现的方式如何。 如果这是Win32,我永远不会创建数千个内核对象,如Mutex,但CRITICAL_SECTION 可能是合理的。 我想知道Java的情况如何。 鉴于争用的可能性很低,监视器的使用是否会超过他们所需的大量内存? 在Java中使用这种低粒度同步的做法有多常见? (显然有一些解决方法,比如使用一个更小的同步对象数组,可以使用一些哈希来访问。我不是在寻找一个实用的解决方案,我正在寻找一个洞察力)。