webForumDet fria alternativet

Long snabbare än Integer

ASPur ASP

16 svar · 428 visningar · startad av Vide

Medlem sedan dec. 19998 577 inlägg
Frågan#1

Har gjort lite tester och kommit fram till att datatypen Long är snabbare i beräkningarna än Integer(16) (VBS).

Anledningen är antagligen att systemet (Processorn) bygger på 32 bitar. Integer(16) är segare p.g.a att systemet måste skala ned ifrån 32, d.v.s, det sker en konvertering.

Dock är Cint snabbare på att konvertera gentemot Clng.

<%
intTimer = Timer()
int1 = cint( "0" )
for i = 0 to 500000
	int1 = ( 1 + int1 ) mod 32768
next
response.write "int: " & Timer() - intTimer & "<br><br>"

intTimer2 = Timer()
lng1 = clng( "0" )
for i = 0 to 500000
	lng1 = ( 1 + lng1 ) mod 32768
next
response.write "lng: " & Timer() - intTimer2 & "<br><br>"
%>

Reflektioner? :)

Medlem sedan feb. 200112 078 inlägg
#2

Jag har inte tid att testa, men responstider, på ett ungefär?

Medlem sedan dec. 20003 887 inlägg
#3

Intressant...

Blir det samma resultat om du använder timeGetTime() istället för Timer() också?

Medlem sedan dec. 19998 577 inlägg
#4

OveRRidE skrev:

Jag har inte tid att testa, men responstider, på ett ungefär?

Skillnaden är inte väldigt märkbar, men intressant (Lokal maskin):

Browser skrev:

int: 8.003906

lng: 7.777344

Medlem sedan dec. 19998 577 inlägg
#5

Engine^ skrev:

Intressant...

Blir det samma resultat om du använder timeGetTime() istället för Timer() också?

Har jag inte testat, men har svårt att tänka mig någon skillnad vad gäller beräkningarna.

Medlem sedan dec. 20003 887 inlägg
#6

timeGetTime() är såvitt jag vet exaktare än Timer()... bara jag som blev nyfiken :)

Medlem sedan juni 20022 599 inlägg
#7

Jag får detta resultat:

int: 5.140625
lng: 5.046875

Men nu kommer det intressanta! Om jag byter plats på looparna så får jag tvärtom:

lng: 5.148438
int: 5.046875

Slutsats?

Medlem sedan dec. 19998 577 inlägg
#8

Systemfel (som ASP bygger på ;))!
Vid körning av "mod 32768" övergår en int till lng eftersom talet är overflow.

Testade detta istället:

<%
intTimer2 = Timer()
lng1 = clng( "0" )
for i = 0 to 2000000
	lng1 = ( 1 + lng1 ) mod 30000
next
response.write "lng: " & Timer() - intTimer2 & "<br><br>"

intTimer = Timer()
int1 = cint( "0" )
for i = 0 to 2000000
	int1 = ( 1 + int1 ) mod 30000
next
response.write "int: " & Timer() - intTimer & "<br><br>"
%>

Ger resultatet:

Browser skrev:

lng: 14.19922

int: 10.18359

Spelar ingen roll om man byter plats på looparna.

Medlem sedan juni 20022 599 inlägg
#9

Med din nya kod fick jag så här:

Original:
lng: 22.67969
int: 18.10938

Bytte plats:
int: 17.58594
lng: 22.5

Slutsats? Hypotesen kanske bör provas i en mängd olika operativ, maskinkonfigurationer, dll-versioner innan man drar nån slutsats?
Man kanske också bör prova med mängder olika sorts kod?

Och ja, jag lovar. Jag har en 32-bitars processor!

Medlem sedan dec. 20002 526 inlägg
#10

tror dig inte niko :P

Medlem sedan juni 20022 599 inlägg
#11

crisse6 skrev:

tror dig inte niko

Nähä?

Synd för dig då att jag har bildbevis. :p

(Man kan inte köra IE6 på en 286:a.)

Medlem sedan dec. 20002 526 inlägg
#12

Just kiddin dude ;)

Medlem sedan feb. 200112 078 inlägg
#13

Snyggt filnamn, där du Niko. ;)

Medlem sedan juni 200032 969 inlägg
#14

:e

Jag har visserligen hört att long skall vara bättre att använda i VB än integer, av nämnda anledningar, men en sak jag har lärt mig är att saker och ting skiljer ganska väsentligt mellan VB och VBScript.

(I .NET är dock integer en 32-bitars datatyp, och long har blivit 64 bitar, hur blir det då? ;) )

mvh

Medlem sedan juni 20008 205 inlägg
#15

niko skrev:

Men nu kommer det intressanta! Om jag byter plats på looparna så får jag tvärtom:
[snip!]
Slutsats?

Process-schemaläggaren effektiviserar schemat när den upptäcker att din ASP-sida vill göra en massa dumberäkningar.

Och ja, det här är implementationsspecifikt. En 16-bitars datatyp kan mycket väl ta upp 32 bitar för att processorn ska kunna bearbeta den effektivare. (Om det faktiskt är så i någon {VB,VBScript}implementation vet jag förstås inte :) )

Medlem sedan juni 20022 599 inlägg
#16

spango skrev:

Process-schemaläggaren effektiviserar schemat när den upptäcker att din ASP-sida vill göra en massa dumberäkningar.

Men i så fall borde den ju upptäcka det redan tidigt i första loopen? Och ordningsföljden skulle spela mindre roll.

Dessutom tror jag inte att schemaläggaren (Windows dispatcher) har några synpunkter på vad enskilda trådar håller på med, eller ens försöker lägga sig i och optimera. Windows funkar inte riktigt så ..

spango skrev:

Om det faktiskt är så i någon {VB,VBScript}implementation vet jag förstås inte

Nej, det funkar inte alls så. I VBScript finns inga 16-bitars integer eller 32-bitars long. Det finns bara en datatyp: Variant. En variant är alltid 16 bytes(!).

Alla VBScriptfunktioner returnerar Varianter, även CLng och CInt.

De två första bytesen i en Variant talar om hur datan i de övriga 14 ska tolkas (exakt hur det funkar vet bara gud och MS). Därför blir resonemang kring snabbheten hos 16- och 32-bitarsoperationer i VBScript lite odefinierade och konstiga.

Medlem sedan juni 20022 599 inlägg
#17

OveRRidE skrev:

Snyggt filnamn, där du Niko.

Tack! :)

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