webForumDet fria alternativet

Timer, opålitligt ?

20 svar · 394 visningar · startad av Macce

MacceMedlem sedan apr. 2001425 inlägg
#1

Hej !

Mäter mina skript med Timer(), tycker att det ger någorlunda
fingervisning om hur lång tid saker och ting tar.

Men hur pålitligt blir detta när jag har en sida utan db connection
men med en del stränghantering, vid tidmätning där får jag
oftast dessa tre olika tider 11.71875ms, 0ms och 7.8125ms

Tycker att det är lite märkligt att det kan variera så mycket
speciellt att det kan bli 0ms ???

Finns det någon gratiskomponent som är "vassare" än timer ?

Mvh

nikoMedlem sedan juni 20022 599 inlägg
#2

Först och främst ska man ha klart för sig att Timer() inte mäter exekveringstiden för ditt script, utan exekveringstiden för samtliga 350(?) trådar och processer i Windows från att ditt script börjar tills det slutar.

Om man har korta script så kan man alltså få kraftiga variationer beroende på vad Windows råkar ha för sig just då.

Finns det någon gratiskomponent som är "vassare" än timer ?

Det finns timers i Windows som är mer exakta än Timer() fast det kommer inte att lösa problemet med variationerna. Vad du skulle behöva är en komponent som bara mäter tiden som ditt script använder. Det vet jag inte om det finns någon .. (Kanske ett projekt för någon?)

Annars kan du ju alltid upprepa koden i dina script X antal gånger för att få längre tider och vettigare värden att jämföra.

MacceMedlem sedan apr. 2001425 inlägg
#3

Annars kan du ju alltid upprepa koden i dina script X antal gånger för att få längre tider och vettigare värden att jämföra.

Det gör jag ibland, men om jag vill mäta ett speciellt script kan jag
använda Microsoft Web Application Stress Tool, fast jag har inte satt mig in i det programmet.

Tycker att Timer() annars är ganska smidigt att includera (svängelska) på sidorna.

Eftersom att jag får svaret 0ms ibland så borde väl mitt skript gå
så fort att det inte går att mäta, och de andra tiderna beror på
mitt system.

eller ?

Mvh

Engine^Medlem sedan dec. 20003 887 inlägg
#4

Jag är inte helt hundra på att det är följande du är på jakt efter men

Private Declare Function timeGetTime Lib "winmm.dll" () As Long
dim lngStart As Long, lngTid As Long

lngStart = timeGetTime
kördittskriptfortsomfanken()
lngTid = timeGetTime - lngStart ' lngTid = tiden det tog i millisekunder.

Något i den stilen?

nikoMedlem sedan juni 20022 599 inlägg
#5

Eftersom att jag får svaret 0ms ibland så borde väl mitt skript gå
så fort att det inte går att mäta, och de andra tiderna beror på
mitt system.

Ja. Som sagt, ju kortare script du kör, desto större andel av tiden kommer att bero på slumpeffekter av vad Windows har för sig i övrigt.

Sen är det ju så att Timer() bara har sju siffrors precision. Pga detta och avrundningsfel så kan du alltså mycket väl få 0 för kortare script.

Källa: http://www.devguru.com/Technologies/vbscript/quickref/timer.html

MacceMedlem sedan apr. 2001425 inlägg
#6

Engine^> Hur kör man din kod i VbScript ?

Engine^Medlem sedan dec. 20003 887 inlägg
#7

Du sätter deklarationen så att den är global. Det borde räcka...

MacceMedlem sedan apr. 2001425 inlägg
#8

Kan du ge mig ett exempel som du provkört i VbScript ?

Engine^Medlem sedan dec. 20003 887 inlägg
#9

Opps... undrar om jag har råkat tänka VB nu och inte VBS... ber om ursäkt isånnafall.

MacceMedlem sedan apr. 2001425 inlägg
#10

Oki :)

nikoMedlem sedan juni 20022 599 inlägg
#11

Engine^> Hur kör man din kod i VbScript ?

Det gör man inte. Man får kapsla in den i en COM-komponent. Och om nån nu skulle ha lust att göra det så kan de också passa på att slänga in:

Public Declare Function GetThreadTimes Lib "kernel32" ..

Den returnerar exekveringstiden enbart för den egna tråden (bortser från övriga Windows), vilket kunde vara intressant som jämförelse. Den har dessutom grym precision (mäter i 100-nano-sekundsintervaller :o ).

MacceMedlem sedan apr. 2001425 inlägg
#12

hmm, ingen som vill glänsa lite och fixa till en liten COM-komponent ? :e

mvh

OveRRidEMedlem sedan feb. 200112 078 inlägg
#13

Fast frågan är ju hur pass rättvisande det blir om man kör det i en komponent, då den troligtvis snor lite tid som även det påverkar resultatet. :)

MacceMedlem sedan apr. 2001425 inlägg
#14

Får köra den utan någon kod mellan start och stopp, och sen räkna bort den tiden. hehe §e

Engine^Medlem sedan dec. 20003 887 inlägg
#15

Summa summarum: det går inte att veta tiden en specifik komponent förbrukar i en Micro$oft-miljö, eftersom Bill Gates alltid tar en viss procent av det skapande eller skapade. :OO

MacceMedlem sedan apr. 2001425 inlägg
#16

Jag kräver inte en noggrannhet på 100nS bara ett mer
rättvisande värde än +- 20ms :stud

mvh

VideMedlem sedan dec. 19998 577 inlägg
#17

Macce skrev:

hmm, ingen som vill glänsa lite och fixa till en liten COM-komponent ? :e

Mjo, jag lekte ihop en liten en... ;)
http://member.webforum.nu/14/webeye.dll

Set oTimer = server.CreateObject( "webeye.TimerClass" )
oTimer.StartTimer

'Kör din kod

oTimer.StopTimer
Response.Write "Tid: " & oTimer.GetTimer() & " ms"

Mvh, Vide

MacceMedlem sedan apr. 2001425 inlägg
#18

Vide> Stark kandidat till årets medlem :birp

Får nu 10ms i 19 fall av 20...

Verkar fungera bättre än timer i a f....

Tusen tack !!!

nikoMedlem sedan juni 20022 599 inlägg
#19

OveRRidE skrev:

Fast frågan är ju hur pass rättvisande det blir om man kör det i en komponent, då den troligtvis snor lite tid som även det påverkar resultatet.

Jag skulle nog påstå att ett par API-anrop och en subraktion är väldigt försumbara i sammanhang där vi mäter exekveringstid hos VBScript. Tiden för att initialisera komponenten kommer ju så klart inte att ingå i differensen.

Vide>> Fuskis. Du använder bara timeGetTime, eller hur? ;)

Engine^Medlem sedan dec. 20003 887 inlägg
#20

Vide: Vilken funktion använde du dig av för att få tiden?

136 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)