|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
Ярослав_К : 8 Новичок Откуда: Москва
|
Мар 11, 2010 0:00 |
|
|
Всем доброго времени суток.
Вопрос: Как измерить реальное время выполнения кода в цикле(чтобы было учтено все время выполнения всех потоков, которые я запускаю в цикле)?
Код:
| Код: |
long time = System.currentTimeMillis();
for (int i=0;i<args.length;i++){
File f = new File(args[i]);
LineCounter counter = new LineCounter(f);
counter.start();
}
System.out.println("Elapsed time: "+(System.currentTimeMillis()-time));
|
|
|
|
|
 |
alon4ik : 923 free butterfly Откуда: Харьков
|
Мар 11, 2010 0:13 |
|
|
если в цикле запускаете потоки - то наверное никак, креме как дожидаться окончания работы всех потоков в самом цикле и делать так как вы написали выше. _________________ ЯроллеR |
|
|
|
 |
Ярослав_К : 8 Новичок Откуда: Москва
|
Мар 11, 2010 0:41 |
|
|
| По "ждать" вы понимаете использование join() для каждого потока? Дело в том, что не могу ждать, так как прога требовательна ко времени выполнения. А если поместить все потоки в массив, завести переменную для каждого потока для хранения времени выполнения, а потом пробежаться по массиву и просуммировать времена..Что думаете? |
|
|
|
 |
vrungel : 227 Новичок Откуда: Киев
|
Мар 11, 2010 0:55 |
|
|
под ждать имелось в виду, что если написать сисаут сразу после цикла, то скорее всего Вы получите дулю, а не нормальные результаты т.к. потоки еще будут продолжать работать. но вот если их поместить в ThreadGroup, то тогда можно будет через activeCount() проверять, все ли выполнились уже. Еще лучше ThreadPool#shutdown(timeout) использовать ну и join само собой - все упирается в то, когда и при каких условиях вам данные получать надо
в принципе можете завести карту <имя потока, длительность>, перед окончанием run высчитывать затраченное время и класть его в карту в синх. блоке. (это если без Callable)
также по идее сработает то же самое, только затраченное время пихать в static volatile long totalTime (здесь на 82% должен присутствовать косяк, который я пока не знаю, но очень хотел бы узнать). но скорее всего лучше будет использовать static AtomicLong totalTime) |
|
|
|
 |
alon4ik : 923 free butterfly Откуда: Харьков
|
Мар 11, 2010 1:25 |
|
|
действительно, всё не так просто. Вначале вам необходимо определить перед началом выполнения цикла текущее время. Потом после окончания работы цикла проверить, завершились ли все потоки, запущенные в цикле. Если да - то снова получаете текущее время и берете разницу (как вы делали выше), если нет, тоесть еще в каком-то одном или нескольких потоках происходят действия, тогда выполнение задачи ещё не окончено, необходимо ждать завершения всех потоков. _________________ ЯроллеR |
|
|
|
 |
vrungel : 227 Новичок Откуда: Киев
|
Мар 11, 2010 1:30 |
|
|
ээ.. а как задача звучит?
если среди двух одновременно стартующих первый 1 выполняет свое действие за 100 млс, а второй 2 - за 200, то ответом на вопрос будет 200 или 300? |
|
|
|
 |
Myryan : 92 Новичок
|
Мар 11, 2010 15:02 |
|
|
| Может еще помочь, если запустить приложение с параметром -Xprof, который покажет время выполнения каждого метода в отдельности + еще много чего интересного. Или воспользоваться профайлером(хотя могу ошибаться, не разу не пользовался). |
|
|
|
 |
Ярослав_К : 8 Новичок Откуда: Москва
|
Мар 13, 2010 20:30 |
|
|
Сделал так: ввел переменную times (изначально 0). В КОНЦЕ метода run() каждого потока увеличиваю эту переменную на 1. и проверяю: если это ЗАКОНЧИЛСЯ последний по счету (цикла) поток(if (times==array.length)), то вывожу текущее время.Это и будет временем окончания всех потоков.Что думаете?
P.S. не думаю, что проверка if сильно повлияет на производительность, т.к. потоков не много, и почти все время они работают с файлами(т.е достаточно долго). |
|
|
|
 |
Jean : 1989 JavaTalks Team Member Откуда: Санкт-Петербург
|
Мар 14, 2010 1:40 |
|
|
Я рекомендую реализовать еще один объект, который будет этим заниматься. Каждый поток по окончании своей работы вместо увеличения переменной times будет оповещать этот объект о том, что он завершил работу. А уже этот объект-менеджер примет решение все ли потоки завершили работу, каким образом считать время и т.д.
А можете показать свой код, каким образом передаете эту переменную и где учитываете ее значение? _________________ Всякое решение плодит новые проблемы |
|
|
|
 |
vrungel : 227 Новичок Откуда: Киев
|
Мар 14, 2010 1:46 |
|
|
| вобще для этого CountDownLatch должен неплохо подойти. каждый поток в конце работы оповещает его, а он в свою очередь слушается отдельным потоком, который и будет выполнять логирование времени. |
|
|
|
 |
|
|
Страница 1 из 1
|
Список форумов
-> Нити и процессы |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|