Java 调用函数的方法

Java 调用函数的方法,java,performance,function,Java,Performance,Function,我正在尝试制作一个API。我只想对终端程序员隐瞒所有细节。我还想为他们提供一些调用函数的选项 我有4个同名但签名不同的函数(重载函数) 在上述序列中,第四个函数ie函数1(arg1、arg2、arg3)具有实际逻辑。rest函数正在使用一些默认值调用下一个函数 现在,如果用户按上述顺序调用第一个函数,即function1(),那么它将使用一些默认值调用第二个函数,即function1(arg1)。等等 我的问题是,这种链接节省了LOC(代码行)并增加了理解。但它是否符合性能视图 和我在一起的条件

我正在尝试制作一个API。我只想对终端程序员隐瞒所有细节。我还想为他们提供一些调用函数的选项

我有4个同名但签名不同的函数(重载函数)

在上述序列中,第四个函数ie
函数1(arg1、arg2、arg3)
具有实际逻辑。rest函数正在使用一些默认值调用下一个函数

现在,如果用户按上述顺序调用第一个函数,即
function1()
,那么它将使用一些默认值调用第二个函数,即
function1(arg1)
。等等

我的问题是,这种链接节省了LOC(代码行)并增加了理解。但它是否符合性能视图

和我在一起的条件

  • 我正在使用Java
  • 我正在使用JDK1.4。因此,支持可变数量的参数

  • 尽管您也可以建议我在其他语言中的性能,但前提是您不建议使用“可变参数数”功能。

    在C/C++等语言中,编译器可以以一种根本不会影响性能的方式处理此类问题。在像Matlab这样的语言中,每个函数调用都有一个显著的时间


    如果这样的时间真的很重要,那么它很大程度上取决于调用方法的频率。如果它们执行一些需要大量计算的操作,或者用于初始化,那么调用它们的频率可能不会太高。在这种情况下,我不担心这个。如果经常打电话给他们,我建议在做决定之前先进行衡量。

    [注意:我假设你在问问题时谈论的是一种现代编程语言(因为它没有明确标记语言)。如果不是这样,请放弃此答案。]

    首先,这种链接的目的不是,也不应该是。就性能而言,代码行是最不重要的,在某种程度上甚至对于可读性来说,尤其是在现代IDE时代。(记录在案:“在某种程度上”。我不认为2500行的方法是好的)

    这样做的目的是避免逻辑的重复,并为程序员带来便利,否则这将是维护的噩梦。(如果您将在所有方法中使用逻辑)以及终端程序员的一些困难(如果您将只有一个实现)

    在现代编程语言中,额外的两个方法类所造成的开销很小。这样的优化(减少方法调用的数量)大多不会带来任何结果

    性能取决于方法所做的事情,如果存在任何性能问题,则应将注意力集中在这一点上


    我看不出有任何问题,包括性能方面的问题,实际上也看到了您在问题中提到的那种方法链接的好处。

    以前在C中有类似的东西,没有提供额外的参数时,它们总是默认值

    为此,我使用了#定义。。。可能不是很漂亮,但它可以工作,并且不会对最终二进制文件的性能产生任何影响(没有额外的堆栈空间,或者程序计数器周围的时间跳跃)。

    这可能会降低性能,但会增加灵活性,并避免用户混淆参数。如果你做了类似的事情,你可以有类似于C++中的默认参数。
    public class function1 {
    
       private String arg1 = "ding";
       private String arg2 = "dong";
       private String arg3 = "dang";
    
       public function1 arg1(String arg1) {
           this.arg1 = arg1;
           return this;
       }
    
       public function1 arg2(String arg2) {
           this.arg2 = arg2;
           return this;
       }
    
       public function1 arg3(String arg3) {
           this.arg3 = arg3;
           return this;
       }
    
       public String eval() {
           return arg1 + arg2 + arg3;
       }
    
    }
    
    System.out.println(new function1().arg2("deng").eval());
    

    也许这有点过分了,但你的论点越多,结果就越好。请注意,如果某些参数是必需的,则可以将它们放入构造函数中。

    通常,调用函数会导致内存跳转,这与按顺序运行相比成本更高。如果只调用了几次,这并不是一个大问题,即使有很多级别的链接。但如果在大循环中调用,则可能会出现明显的性能问题

    注意:
    要将链接减少到最低限度,可以直接从所有简化函数调用最详细的函数(声明了所有参数)

    function1(){
      function1(null,null,null);
    }
    function1(arg1){
      function1(arg1,null,null);
    }
    function1(arg1,arg2){
      function1(arg1,arg2,null);
    }
    
    function1(arg1,arg2,arg3){
       // Actual logic here...
    }
    
    这样你只需要多走一步

    注意:

    编译器可以通过优化调用为您提供一些优势。甚至可能编译器会将对
    function1()
    的初始调用替换为对
    function1(null,null,null)
    的调用,因为这就是
    function1()
    所做的一切。

    不同的语言有不同的性能瓶颈,我怀疑这个问题不可能有一个全面的答案。这是您正在经历的实际问题还是过早优化的问题?唯一确定的方法是测量它。正如我所写的,我已经制作了一个API。我用上面提到的方法使用了很多函数。对不起,我无法将你的答案与我的问题联系起来。这是另一种用默认参数组织“函数”的方法,但可能性能不太好。优点是,您可以按任何顺序提供“参数”。当然,语法没有真正的函数好。
    function1(){
      function1(null,null,null);
    }
    function1(arg1){
      function1(arg1,null,null);
    }
    function1(arg1,arg2){
      function1(arg1,arg2,null);
    }
    
    function1(arg1,arg2,arg3){
       // Actual logic here...
    }