private void test(){
List<String> list=new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
//using utility
boolean flag = Util.search(list,"bbb");
flag = Util.search(list,"aaa");
//using same code here only
for(String obj:list){
if(obj.equals("bbb")){
return true;
}
}
for(String obj:list){
if(obj.equals("aaa")){
return true;
}
}
// util method has same logic as in the method for search
}
我的问题是哪个更好:实用方法或测试方法中的相同逻辑(例如关于性能)?
答案 0 :(得分:3)
忘记性能,这是微不足道的差异,尽可能写出最小的方法,以便代码易于维护。从您的方法中提取代码并使用util方法。
还有一件事是你的方法可以减少为
if(list.contains("aaa")){
return true;
}
不需要for
循环。使用列表
contains
方法
答案 1 :(得分:2)
不应有任何明显的性能差异。
你应该做你认为更清晰,更容易维护的事情。
没有什么区别的原因是JIT可以内联方法,并且在优化后最终会在运行时使用相同的代码。
表现很重要的是当你有大量的收藏和不同的时间复杂性。例如。说你想做
if (words.contains("bbb"))
return true;
如果使用List,则这是O(N)
操作,但是如果使用HashSet,则应该是O(1)
操作。与其他任何你能做的事情相比,这可以产生更大的差异。
简而言之,坚持O(1)或O(log N)或非常小的集合,你应该没问题,除非你的探查器表明你在特定的地方有问题,我不会再猜测如何代码将执行。
注意:有一种情况是实用程序方法可以执行内联代码。对于要优化的代码,它必须运行一定次数或循环一定次数。 (确切的循环次数,调用取决于VM和编译阶段)
从许多地方调用的一个被称为批次(或循环很多)的方法将比在许多地方重复的相同代码更快地进行优化。
答案 2 :(得分:2)
编程中最重要的规则之一:不重复代码。 决不。永远。
编程就像建设新的道路一样:人们会忘记过去建造的每条道路将来都需要维护。
每次复制代码时,您都会创建另一个可能需要触摸的位置。除此之外,许多研究迟早会发现你的重复代码&#34;碎片会开始略有不同(因为你改变了一个地方,你忘记了另一个地方;或者你需要在这里做一点改变;但只在这里;而不是那里)。通常情况下,如果你有很多重复的代码存在细微差别......那就是你会遇到错误的地方。
长话短说:了解语言,以及在考虑性能调优之前JIT如何工作。同时:专注于编写易于阅读和维护的代码。其他任何事情都是巨大的浪费时间。
答案 3 :(得分:1)
我的问题是哪种更好的实用方法或相同的逻辑?
如果您的自定义方法实现与实用程序方法相同的逻辑,则性能差异不应该非常重要。
我的建议是:不要重新发明轮子!
当您拥有经过全面测试,验证和优化的产品时,只需重复使用即可。否则,如果你试图自己重新实现一切,那么犯错和其他问题的可能性很大。