Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: pippo am 18.03.14 - 18:18:23

Titel: notesdatetime milliseconds
Beitrag von: pippo am 18.03.14 - 18:18:23
Hallo,
ich müßte in einem WebService (Script...) bei verschiedenen Punkten die Zeiten messen, und zwar in millisekunden...

habe nichts entsprechendes gefunden :-(

kann es sein, dass man das in Script nicht machen kann

oder hat jemand das vielleicht schon gemacht

bin für jeden Tipp dankbar

Schönen ABEND
Titel: Re: notesdatetime milliseconds
Beitrag von: pram am 18.03.14 - 20:34:04
Hallo Pippo,

wir verwenden dafür folgende Funktion:

Code
Declare Private Function QueryPerformanceFrequency	Lib "Kernel32" (X As Currency) As Boolean
Declare Private Function QueryPerformanceCounter		Lib "Kernel32" (X As Currency) As Boolean

Public Function getTimeMillis() As Currency
	Static startTick 			As Currency
	Static frequency 			As Currency
	Static useHiresCounter 		As Integer
	Dim	  currTick 			As Currency
	If startTick = 0 Then
		Dim sess As New NotesSession
		If InStr(sess.Platform,"Windows") = 0 Then GoTo fail
		On Error GoTo fail
		QueryPerformanceFrequency frequency
		QueryPerformanceCounter 	 startTick
		useHiResCounter = True
		Exit Function
fail:
		startTick = GetThreadInfo(LSI_THREAD_TICKS)
		frequency = GetThreadInfo(LSI_THREAD_TICKS_PER_SEC)
		useHiResCounter = False
		Exit Function
	End If
	If frequency = 0 Then Exit Function ' avoid div/0
	If useHiResCounter Then
		QueryPerformanceCounter 	 currTick
	Else
		currTick = GetThreadInfo(LSI_THREAD_TICKS)
	End If
	getTimeMillis = (currTick - startTick) * 1000 / frequency
End Function
Diese liefert 0 ms für den ersten Aufruf und dann die ms für jeden weiteren, ideal zum timen.
Hinweis GetThreadInfo(LSI_THREAD_TICKS) hat unter Windows nur eine Auflösung von 16ms (bei anderen OS ggf. höher), weshalb hier auf die DLL zurückgegriffen wird.

Gruß
Roland
Titel: Re: notesdatetime milliseconds
Beitrag von: dnotes am 19.03.14 - 06:21:30
Oder Du benutzt Java.

Code
UseLSX "*javacon"

Function getDateWithMilli() As String
	Dim jSession As Javasession
	Set jSession = New JavaSession()
	Dim jClassHeute As JAVACLASS
	Dim jClassDate As JavaClass
	Dim myObjectDate As JavaObject
	Dim myObjectHeute As JavaObject
	
	Dim jMethod As JavaMethod
	Set jClassDate = jSession.Getclass("java/text/SimpleDateFormat")
	Set jClassHeute = jSession.Getclass("java/util/Date")
	Set myObjectHeute = jClassHeute.CreateObject
	Set myObjectDate = jClassDate.CreateObject("(Ljava/lang/String;)V", "yyyy-MM-dd HH:mm:ss.S")
	getDateWithMilli = myObjectDate.format(myObjectHeute)
End Function

Titel: Re: notesdatetime milliseconds
Beitrag von: it898ur am 19.03.14 - 08:01:05
Und nur als Hinweis ...

Vorsicht beim Umgang mit 32bit Windows APIs und 64 Bit Notes-Servern (wir haben das in einem periodischen Agenten benötigt) !

Die Java-Variante läuft dafür aber auch über die LS to Java Schnittstelle und kann in LS-Code mit verwendet werden.

Gruß

André
Titel: Re: notesdatetime milliseconds
Beitrag von: pram am 19.03.14 - 08:43:36
Ja, der Hinweis auf 64 Bit ist durchaus berechtigt. Bisher haben wir das nur in Debug Code und hauptsächlich am Client eingesetzt.

Von mir auch noch ein Hinweis:
LS2J Calls sind langsam. Da in der Java-Variante sehr viel gemacht wird, könnte ich mir vorstellen, dass diese das Messergebnis stark verfälscht.
Ich würde mir alle Objekte zwischenspeichern, so dass letztendlich nur noch folgender Code ausgeführt wird
Code
Set myObjectHeute = jClassHeute.CreateObject
Set myObjectDate = jClassDate.CreateObject("(Ljava/lang/String;)V", "yyyy-MM-dd HH:mm:ss.S")
getDateWithMilli = myObjectDate.format(myObjectHeute)

Oder noch kürzer, wenn man es als double in LS zum Weiterrechnen braucht:
Code
Set myObjectHeute = jClassHeute.CreateObject
getDateWithMilli = myObjectHeute.getTime()

Werd evtl meine Methode so auch noch 64 bit fähig machen :)

Gruß
Roland
Titel: Re: notesdatetime milliseconds
Beitrag von: pippo am 19.03.14 - 13:28:16
Hallo,
erstmals vielen Dank für die Beiträge

habe das nun in meine Libs vom WS eingebaut
hat auch super funktioniert

nur!
habe dann festgestellt, dass das ganze um ca 1 Sekunde langsamer war...
habe dann die Änderungen wieder zurückgestellt: dann wars wieder schnell

habe dann nur UseLSX "*javacon" gesetzt (ohne weiteren Code...) und es war wieder langsam

wie kann das sein, dass zur Laufzeit das so bremst?

Schönen TAG
Titel: Re: notesdatetime milliseconds
Beitrag von: Mitch am 19.03.14 - 14:03:09
habe dann nur UseLSX "*javacon" gesetzt (ohne weiteren Code...) und es war wieder langsam

Ich bestätige diese Beobachtung und häng mich hier mal mit dran. Genau das Problem habe ich auch, ebenfalls über einen Webservice. Habe leider keine Lösung dafür, außer eben auf LS2J zu verzichten. Das fiese ist ja, dass die Sekunde Verzögerung echt kommt, sobald man die javacon nur einbindet. Ob man die nutzt ist vollkommen irrelevant.

Für deine Zeit-Messungen könntest du noch mit dem Timer arbeiten:

Code
startticks# = Timer()
... (Code) ...
Print Timer() - startticks#

... allerdings nutze ich das immer nur in Zehntelsekunden, wie genau dass eigentlich ist, weiß ich nicht. Es liefert aber zumindest acht Nachkommastellen zurück. :)
Titel: Re: notesdatetime milliseconds
Beitrag von: umi am 19.03.14 - 14:38:34

Von mir auch noch ein Hinweis:

LS2J Calls sind langsam.
Gruß
Roland
Titel: Re: notesdatetime milliseconds
Beitrag von: Mitch am 19.03.14 - 15:49:29

Von mir auch noch ein Hinweis:

LS2J Calls sind langsam.
Gruß
Roland

Darum geht es aber bei letzterem Problem nicht. ;) Es wird langsam bevor überhaupt ein LS2J Call gemacht wird.
Titel: Re: notesdatetime milliseconds
Beitrag von: pram am 19.03.14 - 18:24:12
Wenn dir die Auflösung von 16ms reicht, kannst du ja getthreadinfo...  verwenden.
Gruß Roland