2011-04-07 53 views
0

喜誰能幫助我在這個問題上如何估算方法的執行時間,當它使用Java反射調用

我調用一個方法類「CustomeMath」的「添加」現在我想知道的執行這個方法只需要addMe()方法的時間(這個時間不包括用方法調用的執行時間「反射的Invoke()」來調用某個方法。)。我發佈了這個問題的通用代碼。

import java.lang.reflect。*;

public class CustomeMath public int addMe(int a,int b) { return a + b; }

public static void main(String args[]) 
{ 
    try { 
     Class cls = Class.forName("CustomeMath"); 
     Class partypes[] = new Class[2]; 
     partypes[0] = Integer.TYPE; 
     partypes[1] = Integer.TYPE; 
     Method meth = cls.getMethod(
     "addMe", partypes); 
     CustomeMath methobj = new CustomeMath(); 
     Object arglist[] = new Object[2]; 
     arglist[0] = new Integer(37); 
     arglist[1] = new Integer(47); 
     Object retobj 
     = meth.invoke(methobj, arglist); 
     Integer retval = (Integer)retobj; 
     System.out.println(retval.intValue()); 
    } 
    catch (Throwable e) { 
     System.err.println(e); 
    } 
} 

}

現在我想通過該方法「ADDME()」所採取的執行時間。而這段時間不包括時所採取的「調用()」?方法。怎麼做我得到這個時間(記住我不想用‘System.currentTimeMillis的();’)如果你想用一些公關來衡量倍

回答

1

ecision,你必須使用System.nanoTime()。調用addMe()的第一行並再次調用最後一行,計算差異並打印它,請記住,它們是納秒。

如果您希望從外部測量執行時間(在main中),而不包括invoke()的開銷,那麼您根本就不能。

System.currentTimeMillis()非常快相比System.nanoTime()執行,但有一個精度差(幾毫秒),所以要小心,如果addMe()執行快,測量時間可能是不相關的。當您想要測量非常快速的方法的執行時間時,通常在循環中執行千方法,並且只需兩次調用System.nanoTime()即可測量總執行時間,因爲時間度量的開銷可能大於方法本身的執行時間。

+0

@大衛OlivánUbieto – zaree 2011-04-07 06:22:39

+0

@大衛OlivánUbieto 1stly ::我不能把System.nanoTime作爲第一行中我的每一個方法(要獲得執行時間),並得到差(因爲這可能是也一個願望清單提前,我只知道簽名,沒有別的)第二::我的問題是保持在同一點,「我想獲得執行時間所採取的方法,不包括Java的invoke()實用程序所花費的開銷反思「請給一些其他方向的幫助。 – zaree 2011-04-07 06:35:46

+0

@zaree如果您使用反射調用方法,並且您需要測量方法的執行時間而無需調用開銷,則幾乎沒有可能。如果我們可以假設調用開銷遠低於執行時間,則在調用之前和之後使用'nanoTime()'。如果您重複使用'Method'對象並多次調用該方法,則可以忽略調用開銷。如果您無法在每個稱爲(內部或外部)的方法中開始放置時間測量線,請按照說明使用分析器。 – 2011-04-08 04:37:10

1

要檢查性能問題,您通常會使用分析器,然後對算法進行多種變化,並在分析器中比較它們的性能。這是分析人員的主要目的之一,我認爲最好是嘗試使用本土解決方案,這可能會或可能不會給您可靠的結果。其中有不少,我對YourKit有很好的體驗。

而且 - 我認爲一個分析器爲任何嚴肅的開發人員必須具備的工具,無論是編程語言,反正...

0

,以獲得時間無反光的唯一方法是調用方法,無需思考。這是因爲該方法如此微不足道,試圖監視它會產生比實際方法更多的開銷,並且會給你多快的監視方法而不是方法的速度。

public static int addMe(int a, int b) { 
    return a + b; 
} 

public static void main(String args[]) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException { 
    Method addMe = CustomeMath.class.getMethod("addMe", int.class, int.class); 
    int result = (Integer) addMe.invoke(null, 37, 47); 
    System.out.println(result); 

    int runs = 10000000; 
    { 
     long start = System.nanoTime(); 
     for (int i = 0; i < runs; i++) 
      addMe(i, 10); 
     long time = System.nanoTime() - start; 
     System.out.printf("The average call time was %.1f ns%n", (double) time/runs); 
    } 
    { 
     long start = System.nanoTime(); 
     for (int i = 0; i < runs; i++) 
      addMe.invoke(null, i, 10); 
     long time = System.nanoTime() - start; 
     System.out.printf("The average call time using reflections was %.1f ns%n", (double) time/runs); 
    } 
} 

打印

84 
The average call time was 1.4 ns 
The average call time using reflections was 670.1 ns 

一些功課你;

  • 你可以推測爲什麼會有這樣的區別?
  • 爲什麼你會在更現實的例子中得到不同的結果?