Используйте коррелированный подзапрос
select * from tablename a
where not exists (select 1 from tablename b where a.name=b.name having count(*)>1)
ВЫХОД:
id name
2 Chad
4 Tim
long start = System.nanoTime();
methodToBeTimed();
long elapsedTime = System.nanoTime() - start;
Вот то, как может вычислить прошедшее время.
// Get current time
long start = System.currentTimeMillis();
// Do something ...
// Get elapsed time in milliseconds
long elapsedTimeMillis = System.currentTimeMillis()-start;
// Get elapsed time in seconds
float elapsedTimeSec = elapsedTimeMillis/1000F;
// Get elapsed time in minutes
float elapsedTimeMin = elapsedTimeMillis/(60*1000F);
// Get elapsed time in hours
float elapsedTimeHour = elapsedTimeMillis/(60*60*1000F);
// Get elapsed time in days
float elapsedTimeDay = elapsedTimeMillis/(24*60*60*1000F);
Профилировщик является правильным ответом, если у Вас есть больше чем одна функция.
Другая проблема, которую я вижу со всеми предложениями, данными до сих пор, состоит в том, что они хорошо работают для единственной функции, но Ваш код будет замусорен синхронизацией материала, который Вы не можете выключить.
Если Вы знаете, как сделать аспектно-ориентированное программирование, это - хороший способ сохранить код времени в одном месте и применить его декларативно. При использовании чего-то как Log4J для вывода значений, у Вас будет опция выключения или включения его. Это - профилировщик бедного человека.
Взгляните на AspectJ или AOP Spring.
System.nanoTime должен использоваться для точного измерения дельты между двумя разами для микросравнительных тестов.
public class CountTime {
private static void walk() {
for (int i = 0; i < Integer.MAX_VALUE; i++)
;
}
public static void main(String[] args) {
long t0 = System.nanoTime();
walk();
long t1 = System.nanoTime();
System.out.println("Elapsed time =" + (t1 - t0)
+ " nanoseconds");
}
}
System.currentTimeMillis возвращает текущее время в миллисекундах. Можно использовать это для получения текущего времени. Это может быть полезно на более старом VMs или для более длительных рабочих процессов.
Все фрагменты кода выше имеют размеры, приблизительное время протекло со времени, метод был вызван ко времени, метод возвращается/бросает исключение. Такие методы не обращаются к планированию потоков, паузы, должные GC, и т.д.
Да, некоторые профилировщики сделают разумное задание.
При использовании Java 1.6 вперед можно использовать JMX базирующееся управление VM и контролирующий поддержку. Например, можно найти ThreadMXBean.getCurrentThreadCpuTime () значения. Вычисление различия этого значения прежде и после метода вызывает, даст Вам:
"... общее процессорное время для текущего потока в наносекундах. Возвращенное значение имеет точность наносекунд, но не обязательно точность наносекунд. Если реализация различает время непривилегированного режима и системное время режима, возвращенное процессорное время является количеством времени, которое текущий поток выполнил в непривилегированном режиме или системном режиме".
Если Ваш метод будет метать икру от рабочих потоков, то Ваше вычисление должно будет стать намного более тщательно продуманным ;-)
В целом я рекомендую разнюхать java.lang.mangement пакет.
Используйте любого System.currentTimeMillis () или System.nanoTime ():
int someMethod() {
long tm = System.nanoTime();
try {
...
} finally {
tm = System.nanoTime()-tm;
System.out.println("time spent in someMethod(): " + tm + "ns");
}
}
Если Вы хотите получить текущее время, использовать java.util.Date
.