31. marts 2002 - 01:29Der 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 ????
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.
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)"); } }
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
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>
Det må være på tide at lukke. Svar: lav noget .dll-værk
Synes godt om
Ny brugerNybegynder
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.