【问题标题】:Which approach shows better performance: encapsulating into a method or not?哪种方法显示出更好的性能:是否封装到方法中?
【发布时间】:2015-04-16 11:55:25
【问题描述】:

在编写代码时,有时我会遇到这样的情况,我需要选择是创建一个单独的方法(优点是我以后可以使用自己的语法)还是实现已经存在的复杂方法(也更少的代码行数)。

以下是使用不同编程语言(Objective-C 和 Java)来解释问题的示例。

Objective-C 示例:

-(double) maxValueFinder: (NSMutableArray *)data {
double max = [[data valueForKeyPath:@"@max.intValue"] doubleValue];
return maxValue;
}

然后:

...
double max = [self maxValueFinder:data];
...

或者只是每次尝试调用:

...
double max = [[data valueForKeyPath:@"@max.intValue"] doubleValue];
...

Java 示例:

public static double maxFinder (ArrayList<Double> data) {
double maxValue = Collections.max(data);
return maxValue;
}

然后:

...
double max = maxFinder(data);
...

或者只是每次尝试调用:

...
double max = Collections.max(data);
...

或更复杂的情况,使我的问题更清晰:

//using jsoup
public static Element getElement(Document content){
Element link = content.getElementsByTag("a").first();
return link;
}

或每次:

...
Element link = content.getElementsByTag("a").first();
...

哪种方法消耗更少的资源(性能、内存)或相同?

【问题讨论】:

标签: java objective-c performance methods


【解决方案1】:

这绝对不重要。至少在您的 Java 案例中,您在无用地重新创建现有功能,这很荒谬。

您应该首先查看该功能是否包含在标准库中,然后查看现有的知名库是否具有该功能,然后才考虑自己编写实现(尤其是对于更复杂的功能)。

性能与您的问题无关,除非您花在重新创建现有功能上的时间越多,留给实际新代码的时间就越少(因此会降低您的编程性能)。

至于创建包装方法,这在某些情况下可能很有用,尤其是当实际的方法调用经常被链接起来并且您发现自己在代码中拥有越来越多的方法时。但是代码清晰和编写过多代码之间存在细微差别。

public void parseHtml() {
    parseFirstPart();
    parseSecondPart();
    parseThirdPart();
}

如果我们假设每个 parse 方法只包含 1 个或 2 个方法调用,那么添加这些额外的方法很可能是无用的,因为同样的事情可以通过适当的注释来实现。如果parse 方法包含大量调用,那么从它们中提取方法是有意义的。对此没有任何规定,这是您在编程时学习的技能(当然,很大程度上取决于您认为漂亮代码的内容。

【讨论】:

  • 我认为你有重点,但有时会发生功能比我的示例更复杂,例如使用 jsoup:Element link = content.getElementsByTag("a").first();。此外,当您重新创建现有功能时,您可以更轻松地记住个人语法,尤其是当您需要大量使用该方法时。
  • 那是另一回事。制作包装器没有任何问题,例如 getFirstLink(foo) 将执行 foo.getElementsByTag("a").first();。与您的示例不同,您不会在那里重写功能。
  • 程序是否每次调用都会处理方法的全部代码?
  • “处理整个代码”是什么意思。它当然会执行整个代码。 Michal 已经指导您阅读有关premature optimization 的信息,我建议您这样做。在这种不相关的情况下,没有理由担心性能。方法调用不会花费很多时间,JIT 可以根据需要内联它们。
【解决方案2】:
  • 重新创建现有功能绝对没用。
  • 因为这些函数已经在库中实现了。
  • 如果您谈论性能,那么两种情况下您加载的是同一行 double maxValue = Collections.max(data);
  • 性能在这两种情况下都无关紧要,因为您加载的是相同的代码。

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    相关资源
    最近更新 更多