2013-08-08 2 views
2

У меня есть func a(x, y z), что хотел бы время, есть способ это:Как создать функцию таймера?

time = timeit(a(x,y,z)) в Java, раз она будет принимать какие-либо FUNC.

нравится:

long timeit(Object func){ 
    long startTime = System.currentTimeMillis(); 
    func(...); 
    return System.currentTimeMillis() - startTime; 
} 
+6

Либо через отражение, либо образец команды. Или используйте планировщик. –

ответ

1

с помощью отражения:

Если functionCall() является методом экземпляра
-> создать объект для класса
-> Invoke метод, использующий объект этого класса

MyClass objToPass = new MyClass(); 
Method m; 
//Assuming functionCall() takes no arguments 
m = MyClass.class.getMethod("functionCall", new Class[]{}); 
//Parameter list empty 
m.invoke(objToPass, new Object[]{}); 
5

Вам необходимо разместить функцию в Runnable интерфейсе, в public void run() методе. Модифицированный код:

public long timeit(Runnable func) 
{ 
    long startTime = System.currentTimeMillis(); 
    func.run(); 
    return System.currentTimeMillis() - startTime; 
} 

Функция:

public class MyFunction implements Runnable 
{ 
    @Override public void run() { System.out.println(); } 
} 
+0

Я вижу, это будет работать только для функций, реализованных таким образом. – mihajlv

+0

Да. Поскольку Java не может передавать функцию как аргумент, как в JavaScript. – sashok724

+1

@AndreyRedov Вы можете передать объект 'Method' и называть его отражением – BackSlash

0

Как насчет определения интерфейса (скажем FunctionRunner) только с одним методом (назовем его запустить()). Теперь вы можете реализовать этот интерфейс и делать все, что хотите, когда вызывается run(). Тогда ваш код, чтобы измерить время функции будет выглядеть так:

long timeit(FunctionRunner func){ 
    long startTime = System.currentTimeMillis(); 
    func.run(); 
    return System.currentTimeMillis() - startTime; 
} 
+0

Чем этот пост отличается от моего? – sashok724

+0

@ Andrey: Не так много, но я был быстрее: b ... но ваше решение на самом деле лучше, потому что вы используете Runnable, который является существующим интерфейсом –

Смежные вопросы