Обычная версия
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
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
Ярослав_К : 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
К началу Посмотреть профиль Отправить личное сообщение ICQ Number
vrungel : 227
Новичок
Откуда: Киев

СообщениеМар 11, 2010 1:30 
Ответить с цитатой
ээ.. а как задача звучит? Smile
если среди двух одновременно стартующих первый 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
Список форумов
 -> Нити и процессы


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru