Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > тормозят потоки в java


Автор: xma 16.5.2013, 18:53
если запускаю пару Thread'ов всё начинает тормозить в 10 раз .. в чём может быть причина ? 

при этом четыре таких thread'a грузят все 4 ядра на 100% .. а считают каждое медленней раз в 10 , чем если считать всё одним потоком ..
Код

Thread myThready1 = new Thread(new Runnable()
{
  public void run() //Этот метод будет выполняться в побочном потоке
  {
    System.out.println("Привет из побочного потока 1 !");

    long time_ms1 = System.currentTimeMillis() ;
    // ..
    System.out.println(" 1 : Current milliseconds are x"+ 1 +": "
    + ( System.currentTimeMillis() — time_ms1 ) + "ms" );

  }
});
myThready1.start();    //Запуск потока

Автор: LSD 16.5.2013, 19:30
Цитата(xma @  16.5.2013,  19:53 Найти цитируемый пост)
в чём может быть причина ? 

99% что причина в:
Цитата(xma @  16.5.2013,  19:53 Найти цитируемый пост)
// ..


Автор: batigoal 16.5.2013, 19:31
xma, а что в выкинутом фрагменте ( //  .. )?

Автор: xma 16.5.2013, 20:01
о lcd - клёвый мужик - тестировал java на производительность в сравнении с c++  smile 

Цитата(LSD @  16.5.2013,  19:30 Найти цитируемый пост)
99% что причина в:
Цитата(xma @  16.5.2013,  19:53 )
// ..




Цитата(batigoal @  16.5.2013,  19:31 Найти цитируемый пост)
xma, а что в выкинутом фрагменте ( //  .. )? 


// для каждого потока свой cars - cars1, cars2, cars3, cars4 ..  
// создаются до входа в первый поток 
public ArrayList <Car> cars = new ArrayList <Car> (); 

int num = 3000000 ; 
cars.ensureCapacity( num ) ;

        for ( int i=0; i<num; ++i ) {
            Car car = new Car() ;
            car.x = (int) (Math.random() * Location.WIDTH);
            car.y = (int) (Math.random() * Location.HEIGHT);
            cars.add( car ) ;
        }

в выделенном фрагменте

                  for (int i=0; i<300; ++i) {
                      long time_ms1 = System.currentTimeMillis() ;
                      
                        for ( int j=0 ; j<cars.size(); ++j ) {

                            Car car = cars.get( j ) ;
                            
                            car.x = (int) (Math.random() * Location.WIDTH);
                            car.y = (int) (Math.random() * Location.HEIGHT);
                        }
                        
                      System.out.println(" 1 : Current milliseconds are x"+ i +": "
                                  + ( System.currentTimeMillis() - time_ms1 ) + "ms" );
                      
                  }

Автор: chief39 16.5.2013, 23:32
Если 
int num = 3000000 ;  
уменьшить до 30000, например, прогрессирующие тормоза при запуске нескольких тредов остаются?

Автор: LSD 17.5.2013, 10:45
Выкинуть Math.random() и каждому потоку дать свой собственные java.util.Random

Автор: xma 17.5.2013, 20:31
Цитата(LSD @ 17.5.2013,  10:45)
Выкинуть Math.random() и каждому потоку дать свой собственные java.util.Random

попёрло . только не стоит создавать по 3 млн. Random в каждом потоке ..  smile 

прирост в 3.5 раза относительно одного потока .

 smile 

как там с производительностью java , что нового ?  smile 

Автор: LSD 20.5.2013, 10:43
Цитата(xma @  17.5.2013,  21:31 Найти цитируемый пост)
только не стоит создавать по 3 млн. Random в каждом потоке ..

Это еще зачем? Я же сказал:
Цитата(LSD @  17.5.2013,  11:45 Найти цитируемый пост)
потоку дать свой собственные java.util.Random

один на поток, достаточно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)