Avatar billede dsj Nybegynder
31. marts 2002 - 01:29 Der er 8 kommentarer og
1 løsning

Høj resolutions timer i Java ?

Jeg har lavet et program, hvor jeg bl.a. måler responstiden til en server. For at gøre dette anvender jeg metoden System.currentTimeMillis(). Den er dog ikke særlig præcis (måler kun i hele 10 ms) og jeg ved at det skyldes styresystemet (i dette tilfælde XP), der anvender en upræcis timer.

Nogen der ved, hvordan jeg på let vis kan måle mere præcist - i hvert fald ned til 1 ms nøjagtighed ????
Avatar billede jakoba Nybegynder
31. marts 2002 - 01:42 #1
lav 100 målinger og del så med 100.
Avatar billede jakoba Nybegynder
31. marts 2002 - 01:49 #2
Java benytte sig af windows's multitaksing kerne til at lave sin egen multitasking så du skal ikke regne med at gøre gramulariteten mindre end en windows time-slot.
Men med en gennemsnittet af en masse måliger får du alligevel øget præcicionen med ca sqrt(antal målinger). I gennemsnit. Du kan være (meget) uheldig og ikke få spor bedre præcision ud af det.

mvh JakobA
Avatar billede stigc Nybegynder
31. marts 2002 - 01:51 #3
Har ikke selv prøvet, men i timer klassen snakker de om nanosekunder.

http://java.sun.com/products/java-media/jmf/2.1.1/apidocs/javax/media/Time.html
Avatar billede dsj Nybegynder
31. marts 2002 - 16:25 #4
Da jeg en gang i sekundet i mit program vil vise responstiden til serveren, er det ikke nogen god ide at lave for mange målinger. JMF har jeg downloadet og anvendt klassen SystemTimeBase, der skulle kunne måle nanosekunder - det kan den bare ikke.

Jeg har så fundet frem til noget kode, som anvender Java Native Interface. Jeg ved bare ikke, hvordan jeg andvender den kode i mit normale program, nogen der ved det?

class HiResTimer {
  public native boolean isHighResTimerAvailable();
  public native double startTiming();
  public native double endTiming(double dStart);

  static {
    System.loadLibrary("hirestimer");
  }

  public static void main() throws Exception {
    HiResTimer timer = new HiResTimer();
    double dStart=0.0, dEnd=0.0;
    if( timer.isHighResTimerAvailable() ) {
      System.out.println(
          "high res timer is available" );
    } else {
      System.out.println(
          "high res timer is not available" );
    }

    dStart = timer.startTiming();
    dEnd = timer.endTiming(dStart);
    System.out.println(
      "granularity of hi-res timer is " +
      (dEnd*1000) + " microseconds");

    dStart = timer.startTiming();
    Thread.sleep(1000);
    System.out.println( "timer test=" +
      timer.endTiming(dStart) +
      " milliseconds (should be around 1000)");

    dStart = timer.startTiming();
    Thread.sleep(2000);
    System.out.println( "timer test=" +timer.endTiming(dStart)+ "milliseconds (should be around 2000)");
  }
}

Main-metoden er der af testhensyn.
Avatar billede dsj Nybegynder
31. marts 2002 - 16:31 #5
Kører jeg mainmetoden får jeg følgende fejl:
java.lang.UnsatisfiedLinkError: no hirestimer in java.library.path
Avatar billede stigc Nybegynder
31. marts 2002 - 16:34 #6
Der er vel nogen der skrevet en rutine i et andet sprog og kompileret det til den platform de nu brugte. Den kode skal du have fat i. Men det betyder af dit program ikke bliver platformsuafhængig
Avatar billede dsj Nybegynder
31. marts 2002 - 16:43 #7
Der er ikke så meget at gøre ved at programmet bliver afhængig af platformen. I de nye windows kan den måle med 10 ms nøjagtighed i 95/98 kun med omkring 55 ms!!

Jeg har fundet følgende C++ kode: (måske ved I hvad der skal gøres ved det...)

Wrapping with C++ The HiResTimer.cpp class is the C++ code that wraps the QueryPerformanceFrequency and QueryPerformanceCounter functions. 
#include "HiResTimer.h"
#include <windows.h>

// -------------------------------------------
// HiResCounter
// -------------------------------------------
class _HiResCounter{
  public:
      _HiResCounter()
      { m_bExists = QueryPerformanceFrequency(
        &m_Freq ); }

  BOOL Exists()
      { return m_bExists; }

  double Freq()
      { return (double)(m_Freq.QuadPart); }

  protected:
      BOOL m_bExists;
  LARGE_INTEGER m_Freq;
};

static _HiResCounter HiResCounter;

// -------------------------------------------
// Class:    HiResTimer
// Method:    isHighResTimerAvailable
// Signature: ()Z
// -------------------------------------------
JNIEXPORT jboolean JNICALL
Java_HiResTimer_isHighResTimerAvailable
  (JNIEnv *, jobject)
{
  return HiResCounter.Exists();
}

// -------------------------------------------
// Class:    HiResTimer
// Method:    startTiming
// Signature: ()D
// -------------------------------------------
JNIEXPORT jdouble JNICALL Java_HiResTimer_startTiming
  (JNIEnv *, jobject)
{
  LARGE_INTEGER li; 
  if( HiResCounter.Exists() ) {
      QueryPerformanceCounter( &li );
      return (double)(li.QuadPart);
  } else {
      return (double)GetTickCount();
  } // else

}

// -------------------------------------------
// Class:    HiResTimer
// Method:    endTiming
// Signature: (D)D
// -------------------------------------------
JNIEXPORT jdouble JNICALL Java_HiResTimer_endTiming
  (JNIEnv *, jobject, jdouble dStart )
{
  LARGE_INTEGER li;
  if( HiResCounter.Exists() ) {
      QueryPerformanceCounter( &li );
      return ((li.QuadPart - dStart) * 1000.0 /
        HiResCounter.Freq());
  } else {
      return (GetTickCount() - (DWORD) dStart);
  } // else
}

// -------------------------------------------
// DllMain
// -------------------------------------------
BOOL APIENTRY DllMain(HANDLE hModule,
  DWORD  ul_reason_for_call,
  LPVOID lpReserved)
{
  switch (ul_reason_for_call)
  {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
        break;
  }
  return TRUE;
}
Avatar billede dsj Nybegynder
31. marts 2002 - 16:44 #8
Se evt:
http://www.devx.com/premier/mgznarch/javapro/2001/08aug01/km0108/km0108p.asp

Der er en detaljeret forklaring, som jeg dog ikke får det helt store ud af.
Avatar billede dsj Nybegynder
30. september 2002 - 15:10 #9
Det må være på tide at lukke. Svar: lav noget .dll-værk
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB