---
title: "Mer sträng tester"
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/66328-mer-sträng-tester"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "Erik Juhlin"
published: "2003-01-27T15:17:05.000Z"
updated: "2003-01-29T08:25:12.000Z"
replies: 21
views: 542
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/asp/66328-mer-sträng-tester"
---

# Mer sträng tester

_Sida 1 av 2._

## #1 — Erik Juhlin, 2003-01-27T15:17Z

Context-switchar verkar vara snabbast... :)

```
<html><%
Dim i, init, diff, str

'Metod 1
Response.Write "<!--"

init = Timer
For i = 0 To 10000
	%>i=<%=i%>
|<%
Next
diff = Timer - init

Response.Write "-->"

Response.Write "Metod 1 (context-switchar): " & FormatNumber(diff, 3, True) & "<br>"

'Metod 2
Response.Write "<!--"

init = Timer
For i = 0 To 10000
	Response.Write "i="
	Response.Write i
	Response.Write vbCrLf
	Response.Write "|"
Next
diff = Timer - init

Response.Write "-->"

Response.Write "Metod 2 (Response.Write): " & FormatNumber(diff, 3, True) & "<br>"

'Metod 3
Response.Write "<!--"

init = Timer
With Response
For i = 0 To 10000
		.Write "i="
		.Write i
		.Write vbCrLf
		.Write "|"
Next
End With
diff = Timer - init

Response.Write "-->"

Response.Write "Metod 3 (With Response): " & FormatNumber(diff, 3, True) & "<br>"

'Metod 4
Response.Write "<!--"

init = Timer
For i = 0 To 10000
	str = str & "i=" & i & vbCrLf & "|"
Next
Response.Write str
diff = Timer - init

Response.Write "-->"

Response.Write "Metod 4 (konkatenering): " & FormatNumber(diff, 3, True) & "<br>"
%></html>
```

Permalänk: https://www.webforum.nu/p/66328

## #2 — JAreMANNEN, 2003-01-27T15:19Z

Första testen:
Metod 1 (context-switchar): 0,016
Metod 2 (Response.Write): 0,000
Metod 3 (With Response): 0,031
Metod 4 (konkatenering): 1,359

Andra testen:
Metod 1 (context-switchar): 0,000
Metod 2 (Response.Write): 0,016
Metod 3 (With Response): 0,016
Metod 4 (konkatenering): 1,391

Permalänk: https://www.webforum.nu/p/928472

## #3 — Erik Juhlin, 2003-01-27T15:21Z

Du har nog lite för snabvb dator. Kan ju öka på till 10-20 000 då för att märka nån skillnad. :)

Permalänk: https://www.webforum.nu/p/928474

## #4 — OveRRidE, 2003-01-27T15:22Z

Där ser man. :)

Och hur många gånger har man inte sett predikan om att inte context-switcha? ;)

Permalänk: https://www.webforum.nu/p/928479

## #5 — OveRRidE, 2003-01-27T15:22Z

```
Metod 1 (context-switchar): 0,031
Metod 2 (Response.Write): 0,051
Metod 3 (With Response): 0,109
Metod 4 (konkatenering): 7,301
```

800Mhz, 256, win2000 pro.

Permalänk: https://www.webforum.nu/p/928480

## #6 — colione, 2003-01-27T15:34Z

Försök 1 (Utan något fönster öppet förutom testfönstret)

```
Metod 1 (context-switchar): 10,930
Metod 2 (Response.Write): 18,789
Metod 3 (With Response): 20,492
Metod 4 (konkatenering): 36,469
```

Försök 2

```
Metod 1 (context-switchar): 14,891
Metod 2 (Response.Write): 19,281
Metod 3 (With Response): 21,090
Metod 4 (konkatenering): 17,578
```

Försök 3

```
Metod 1 (context-switchar): 15,160
Metod 2 (Response.Write): 19,609
Metod 3 (With Response): 21,039
Metod 4 (konkatenering): 17,570
```

Försök 4

```
Metod 1 (context-switchar): 15,051
Metod 2 (Response.Write): 19,449
Metod 3 (With Response): 21,031
Metod 4 (konkatenering): 18,570
```

De andra försöken med ett mapp-fönster öppet och webforum öppet.

166MHz, 32, Win98SE

Permalänk: https://www.webforum.nu/p/928491

## #7 — @nders, 2003-01-27T15:38Z

Hmmm...

```
Metod 1 (context-switchar): 0.016
Metod 2 (Response.Write): 0.031
Metod 3 (With Response): 0.109
Metod 4 (konkatenering): 12.531
```

P4 1.8 GHz, 512 Mb RAM. Det var lite skillnad, se...

Permalänk: https://www.webforum.nu/p/928496

## #8 — niko, 2003-01-27T15:45Z

Sen kan man ju fråga sig om:

```
For i = 0 To 10000
	%>i=<%=i%>
|<%
```

verkligen ger 10000 context-switchar? Är det inte så att tolken "för-kompilerar" hela loopen **en** gång snarare än att tolka innehållet 10000 gånger?

Får man samma resultat om man skriver \<%=nånting%\> explicit 10000 ggr och jämför det med 10000 explicita response.write?

Permalänk: https://www.webforum.nu/p/928503

## #9 — Erik Juhlin, 2003-01-27T16:07Z

Men det är ju just i loopar man brukar oroa sig för att context-switcharna ska ställa till det.
Jag tror det där med context-switchar är något gammalt. :)

Permalänk: https://www.webforum.nu/p/928512

## #10 — niko, 2003-01-27T16:32Z

> **Erik Juhlin skrev:**
>
> Men det är ju just i loopar man brukar oroa sig för att context-switcharna ska ställa till det.

För all del. Men det är bara i *vissa* enklare fall som ASP-tolken kan förutsäga innehållet i loopen och göra en optimering. I fallet med konkatenering så går det tex *inte*. Därför blir ditt sätt att jämföra ganska missvisande.

Skrev själv en VB-app som fyllde ett asp-dokument med 10000 explicita helt slumpmässiga context-switchar och 10000 explicita (också slumpmässiga) "response.write".

Resultat:

Metod 1 (context-switchar inuti loop): 0.191
Metod 2 (Response.Write inuti loop): 0.242

Metod 1 (10000 "äkta" context-switchar): 8.634
Metod 2 (10000 "äkta" Response.Write): 5.027

Slutsats: ASP-tolken kompilerar (om möjligt) innehållet i loopar *innan* loopen startar. Enskilda context-switchar är långsammare än enskilda "response.write". Inte mycket, men dock.

Permalänk: https://www.webforum.nu/p/928529

## #11 — Toonster, 2003-01-27T17:45Z

Håller med niko. Bara för att man har en loop, så är det inte säkert att det blir kontextswitch, eftersom innehållet i loopen första gången lagras, och sedan återanvänds.

Då är en "lång" sida med många stycken av ren HTML och \<% kod %\> bättre ur testningssynpunkt.

Fast mätmetoden i sig är inte helt korrekt, eftersom koden tar tiden på sig själv. Det är bättre med någon typ av ISAP modul som fixar tiden från att IIS dyker in i filen, och avslutar den.

Dessutom så måste man testa sidan (som erik gjorde) kanske några hundra gånger, för att slippa effekten av minnescachning.

btw:
Metod 1 (context-switchar): 0,008
Metod 2 (Response.Write): 0,031
Metod 3 (With Response): 0,133
Metod 4 (konkatenering): 10,344

XP, 1,2GHz (med Kazaa igång...)

Permalänk: https://www.webforum.nu/p/928605

## #12 — Erik Juhlin, 2003-01-27T18:35Z

Hmm, jo ligger väl lite i det niko säger. Men hellre lite context-switchar som är lite långsammare än kluddig kod. :)

Kontakteneringen i VB/ASP är hemsk. Men vet någon om VBs kompilator inte kokatenerar hårdkodade strängar? Typ:

```
sql = "..." _
& "..."
```

Man tycker den borde sätta ihop det redan när den kompilerar. :)

Permalänk: https://www.webforum.nu/p/928650

## #13 — niko, 2003-01-27T19:26Z

> **Erik Juhlin skrev:**
>
> Man tycker den borde sätta ihop det redan när den kompilerar.

Men se det tycker inte VB. :) 

Den anser att om du skriver:

```
myString1 = "Hej " & "då"
```

så får du skylla dig själv. Den skriver ner två strängar "Hej " och "då" i resurssegmentet och sen sätter den ihop dom under exekveringen. Om du sen lägger till en rad:

```
myString2 = "Hej "
```

.. så återanvänds det gamla "Hej ". På så sätt tjänar den 8 Bytes minnesutrymme, vilket den inte kunnat göra om den kompilerat "Hej " & "då" som "Hej då".

Permalänk: https://www.webforum.nu/p/928710

## #14 — niko, 2003-01-27T19:44Z

> **Erik Juhlin skrev:**
>
> Kontakteneringen i VB/ASP är hemsk.

Ja, och det har att göra med att varje &-tecken kräver en ny minnesallokering hur liten sträng vi än ska klippa på. Vad man brukar göra är att skriva en egen strängklass som "förallokerar" stora block av minne och sen använder "CopyMemory" för att föra över tecknen.

Här är ett exempel: <http://www.vbaccelerator.com/home/VB/Code/Techniques/StringBuilder/String_Builder_Class_and_Demonstration_zip_cStringBuilder_cls.asp>

Mycket snabbt om man har stora mängder konkateneringar.

Permalänk: https://www.webforum.nu/p/928734

## #15 — Erik Juhlin, 2003-01-27T22:40Z

404\... :(
Är det den gamla hederliga Sprintf funktionen som tas upp?

Permalänk: https://www.webforum.nu/p/928894

## #16 — niko, 2003-01-27T22:46Z

Du får ta bort "%20" "\<br%20/\>" ur URL:en. wF envisas med att lägga till dem. Vet inte varför.

> Är det den gamla hederliga Sprintf funktionen som tas upp?

Sprintf? Från C?

Permalänk: https://www.webforum.nu/p/928896

## #17 — Palle, 2003-01-27T23:48Z

Metod 1 (context-switchar): 0,020
Metod 2 (Response.Write): 0,040
Metod 3 (With Response): 0,250
Metod 4 (konkatenering): 18,066

AMD Athlon TB 800mhz, 512mb ram.

Permalänk: https://www.webforum.nu/p/928918

## #18 — Erik Juhlin, 2003-01-28T08:07Z

niko: Ja, vi har en sån funktion i vårt funktionsbibliotek. Har aldrig använts, men finns där ändå. :)

Permalänk: https://www.webforum.nu/p/929020

## #19 — Toonster, 2003-01-28T19:29Z

Om man är ute efter max prestanda med ASP, så ska man göra koden i JavaScript. Har för mig att detta testades prestandamässigt här i forumet för ett bra tag sedan.

Permalänk: https://www.webforum.nu/p/932583

## #20 — Erik Juhlin, 2003-01-28T19:52Z

JScript gick långsammare i de testet som var på webForum.

Permalänk: https://www.webforum.nu/p/932602

---

Tråden på webben: https://www.webforum.nu/amne/asp/66328-mer-sträng-tester  
Nästa sida: https://www.webforum.nu/amne/asp/66328-mer-sträng-tester/page2.md
