Как я могу измерить время пула потоков в Java?

1

Я использовал два разных подхода для измерения времени потоков, но результат не соответствует

    **Public void Main()** 
{
        Timer timer = new Timer();
                    int timetotal;


                    timer.start();
            int numberOfThreads=5;
            ExecutorService pool= Executors.newFixedThreadPool(numberOfThreads);
            List<Future<Boolean>> futureList = new ArrayList<Future<Boolean>>();
            Set<ReadProcess_MongoDB> callList = new HashSet<ReadProcess_MongoDB>();
            CompletionService<ReadProcess_MongoDB> taskCompletionService;
            taskCompletionService = new ExecutorCompletionService<ReadProcess_MongoDB>(pool);

            Collection<Callable<ReadProcess_MongoDB>> list;
            list = new LinkedList<Callable<ReadProcess_MongoDB>>();

            for(int i=0;i<numberOfThreads;i++)
               list.add((Callable<ReadProcess_MongoDB>) new ReadProcess_MongoDB(i));

                try {

                    for (Callable<ReadProcess_MongoDB> callable : list) {
                        taskCompletionService.submit(callable);
                  }
                    for (int i = 0; i < list.size(); i++) {
                    Future<ReadProcess_MongoDB> result = taskCompletionService.take(); 

                    }
                } catch (InterruptedException e) {
                    // no real error handling. Don't do this in production!
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    // no real error handling. Don't do this in production!
                    e.printStackTrace();
                }
                finally {
                    pool.shutdown();
                     System.out.println("Done :)");
                     timer.stop();
                     System.out.println("Total consumed Time"+ timer.elapsed());
                 }

В другое время я ввел метод вызова()

 **public String call()**
     {

          Timer timer = new Timer();
            int timetotal;


            timer.start();
                DBCursor cursor = coll.find(whereQuery);
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                Logger.getLogger(ReadProcess_MongoDB.class.getName()).log(Level.SEVERE, null, ex);
            }
            timer.stop();
            usedTimeForQueryProcess = timer.elapsed();
            System.out.println("Thread Number="+this.threadNumber+  "   MongoDB_readQuery used time "+usedTimeForQueryProcess);
            System.out.println("runing.....");
      return Objects.toString(usedTimeForQueryProcess);
     }

В функции вызова время системной печати каждого потока и в функции Main отображается только общее время. Здесь я пытаюсь проверить вручную, но оба раза не совпадают. Но большая проблема заключается в том, что функция Main показывает меньше времени, чем общее время всех потоков (функция вызова),
Я также попытался вернуть время использования из функции вызова. Но он также создает проблему с преобразованием в длинную (особенно проблему времени выполнения).
Время обеих функций
Главное время функции = 289 Время функции вызова = 510 (5 потоков).
Удовлетворит ли кто-нибудь, почему это происходит и как я могу сделать правильное измерение?

  • 0
    Хм, чего вы хотите достичь, измеряя это? У вас есть конкретная проблема, или это просто интеллектуальное любопытство?
  • 0
    @fge Я занимаюсь разработкой приложения для тестирования производительности рабочей нагрузки (чтение / запись) различных типов баз данных (sql и noSql).
Теги:
multithreading
time

1 ответ

1
Лучший ответ

Главное время ниже, чем общее количество ваших заданий, потому что они работают параллельно. Если вы уменьшите размер пула потоков до 1, то числа будут больше похожими на то, что вы ожидаете.

Это одно из преимуществ выполнения многопоточного программирования, что позволяет сделать больше работы за меньшее время, чем если бы это было сделано последовательно.

  • 0
    Нет разницы даже после того, как число numberOfThred = 1. Это почти то же самое время, о котором я упоминал в вопросе (время основной функции 278) и одно время 102 (функция вызова)
  • 0
    Я в замешательстве, с одним потоком это только 102 для потока и 278 в целом. Это кажется совершенно логичным для меня
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню