Java потоков, похоже, ускоряются по мере добавления большего количества потоков - PullRequest
2 голосов
/ 05 августа 2020
• 1000 затем остановитесь и напечатайте их значение счетчика, а также время, которое потребовалось потоку для завершения выполнения той части, которая мне небезразлична. Вот мой код:
 public static void main(String []args){
     
     for(int j=0;j<200;j++){
         final int x = j;
         new Thread(()->{
             System.out.println("start " + x);
             
             try{Thread.sleep(500);}catch(Exception e){}//this lets all the threads be created before running any calculations
             
             long a = System.nanoTime();
             for(int i=0;i<1000000000;i++){
                 
             }
             long b = System.nanoTime();
             
             System.out.println("stop " + x + " : " + ((b-a))/1000000000.0);//outputs time in seconds
             
         }).start();
         
         
     }
 }

Странно то, что когда j, количество созданных потоков низкое (обычно <50), результат выглядит так, как я считаю нормальным - вот пример с 6 потоками: </p>

start 3
start 1
start 4
start 5
start 0
start 2
stop 5 : 0.0035043
stop 1 : 0.0034917
stop 4 : 0.0035097
stop 2 : 0.004224
stop 0 : 0.0025082
stop 3 : 0.004472

Обратите внимание на то, что все времена больше 0,003. Однако, когда создается много потоков, появляется "нормальное" время (аналогично приведенному выше), но большая часть, как правило, дает время порядка 10 ^ -5 - вот фрагмент вывода:

stop 49 : 1.09E-5
stop 13 : 2.81E-5
stop 2 : 1.98E-5
stop 18 : 6.4E-6
stop 19 : 0.0616381
stop 7 : 0.0575055
stop 14 : 0.0648309

У меня вопрос - как это возможно, чтобы по мере добавления большего количества потоков время их выполнения становилось короче? Разве это не логично, что при добавлении большего количества выполняемых потоков все они в среднем должны занимать больше времени? Я почти уверен, что это не проблема волатильности - каждый поток должен иметь возможность касаться только данных, относящихся к самому себе. Шестиядерный процессор с тактовой частотой 4 ГГц и 17+ ГБ ОЗУ

1 Ответ

0 голосов
/ 06 августа 2020

Когда вы запускаете свою программу, отключите JITing с помощью -D java .compiler = NONE. Если это дает вам единообразное время выполнения, то меньшее время выполнения можно отнести к JITing. В противном случае вы можете продолжить расследование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...