【问题标题】:Method invocation vs method execution方法调用与方法执行
【发布时间】:2010-11-20 23:42:37
【问题描述】:

方法调用时间和方法执行时间有区别吗?我认为我们可以很容易地测量方法执行时间。但是我如何测量方法调用时间。 会不会每次都不一样。 (Java)

【问题讨论】:

    标签: java


    【解决方案1】:

    调用时间是调用或调用方法所需的时间。 执行时间是执行方法体所需的时间。

    请参阅 JVM 规范中的 7.7 Invoking MethodsInstruction Set。有 4 种不同的方式可以调用 Java 方法:

    1. invokevirtual - 用于类方法调用
    2. invokeinterface - 用于接口方法调用
    3. invokestatic - 用于静态方法
    4. invokespecial - 用于构造函数、私有方法和super 调用

    invokestatic 通常是最快的,因为它与特定的类相关联,而其他类可能相对较慢。 invokeinterface 可能是最慢的,因为类可以实现多个接口,必须解析正确的方法。

    同一方法的不同调用将花费相同的时间。

    【讨论】:

    • 这让我想到了一个有趣的问题。 Java 的安全性依赖于 VM。那么你可以使用invokestatic 来调用派生类方法的基类版本吗?如果是这样,这似乎是一个可能的安全漏洞。
    • @Omnifarious:为此,您必须修改 .class 文件,我不认为这是 VM 中的安全漏洞。
    • 你不能用一个新类创建一个.class 文件吗?在其他类的方法上调用invokestatic
    • @Omnifarious:当然可以,但这相当于编写一个简单的 Java 程序来调用静态方法——总是可能的,而不是安全漏洞。 :) 当然,如果你手动更改.class文件但方法不存在或不是静态的,JVM会抛出链接错误。
    • 啊,是的,这是有道理的。我认为,为了更详细地回答我脑海中渗透的问题,我必须阅读 JVM。
    【解决方案2】:

    调用 = 执行 ---> 调用时间 = 执行时间。

    【讨论】:

      【解决方案3】:

      调用一个方法和执行一个方法是同义词——它们是同一个东西。

      也许我误解了你的问题。

      【讨论】:

      • 好的,这意味着如果我必须测量每次调用特定方法需要多长时间,那么这意味着方法执行所需的时间。因此,如果我在调用方法之前和方法返回之后测量时间,然后计算给我方法调用/或方法执行时间的差异。
      • invocation 是调用方法,一旦你进入方法执行就会发生。
      • 这意味着两者是不同的..我们如何测量方法调用时间..我的意思是如果我调用一个类的某个方法说 add(int x, int y) 可能是方法调用时间..我的意思是我刚刚调用了该方法,这意味着该方法将立即被调用..哪些因素将计入方法调用的时间?
      • @kd44:什么都没有“立即”发生。请参阅我的回答,了解如何以不同方式调用不同类型的方法。
      • 那我如何测量调用时间?
      猜你喜欢
      • 2016-03-22
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 2017-11-10
      • 2021-06-09
      • 1970-01-01
      相关资源
      最近更新 更多