Hallo Pippo,
wir verwenden dafür folgende Funktion:
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
Oder Du benutzt Java.
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
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
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:
Set myObjectHeute = jClassHeute.CreateObject
getDateWithMilli = myObjectHeute.getTime()
Werd evtl meine Methode so auch noch 64 bit fähig machen :)
Gruß
Roland
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:
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. :)