piątek, lipca 15, 2011

Co robi Sleep w Tibco BusinessWorks?

Sleep w BW powoduje oddanie wątku wykonującego aktualny proces do puli Engine.ThreadCount. Czas powrotu procesu do działania jest niedeterministyczny, silnik BW szuka pierwszego wolnego wątku z puli, aby przydzielić mu wykonywanie procesu od aktywności następującej po Sleep. Bardziej deterministyczne pauzowanie procesu można osiągnąć przez Java Code Thread.sleep() lub (dla małych wartości) LockSupport.parkNanos().



Kiedy jeszcze nastąpi przełączenie wątku (oprócz aktywności blokujących)? Kiedy wątek silnika w pojedynczym procesie wykona 20 aktywności (Engine.StepCount).

REKLAMA: TDI - najlepszy profiler do Tibco BW, do kupienia u dobrych dostawców usług EAI.

W Windows 7 domyślna rozdzielczość kroku zegara to 15.6ms, ale można ją polepszyć dochodząc do 1ms. Umie to wykorzystać Java 1.7:

public class TimerResolution {
  public final static void main(String[] args) {
    TreeMap<Long,Long> map = new TreeMap<Long,Long>();
    for (int i=0; i < 15000; i++) {
      long t0 = System.currentTimeMillis();
      try {
        LockSupport.parkNanos(1000000);
      }
      catch (Exception e) {}
      long dt = System.currentTimeMillis()-t0;
      map.put(dt, i);   
    }
    int mid = map.size()/2;
    Iterator<Entry<Long, Long> it = map.entrySet().iterator();
    for (int i = 0; i < mid; i++)
      it.next();
    System.out.println("Timer resolution: "+
      it.next().getKey()+" ["+map.size()+"]");
  }
}

Timer resolution: 3 [4]

To samo z System.nanoTime()/1000
i Thread.currentThread().setPriority(Thread.MAX_PRIORITY):

Timer resolution: 995 [255]

0 komentarze: