Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Loop-problem

Postades av 2003-08-23 21:58:17 - Johan Hjort, i forum visual basic - allmänt, Tråden har 9 Kommentarer och lästs av 476 personer

Fick denna funktion av bj, (portad från Delphi till VB).

<code>
Function str(strp As String, bah As Integer) As String
Dim i As Integer
Dim temp As String
For i = 1 To bah
temp = temp & strp
Next
strp = temp
End Function
</code>

Och använder detta för att kalla på funktionen,
<code>
MsgBox "hej" & str("x", 4) & "då"
</code>

Nu är det så att den egentligen ska visa "hejxxxxdå", men istället visar den
"hejdå". Jag förstår inte varför, och bj kommer inte ihåg hur man får det
att fungera i VB.

Tack på förhand.


Svara

Sv: Loop-problem

Postades av 2003-08-23 22:00:19 - Björn Johansson

function str(strp as string, bah as integer) as string
dim i as integer
dim temp as string
for i = 1 to bah
temp = temp & strp
next
str = temp
end function

ska det vara...


Svara

Sv: Loop-problem

Postades av 2003-08-23 22:00:35 - Oskar Johansson

msgbox "hej" & string("x", 4) & "då"

alt. att du vänder på parametrarna till string-funktionen, du får testa eller kolla ii hjälpen... str är hur som helst en funktion i vb...


Svara

Sv: Loop-problem

Postades av 2003-08-23 22:01:41 - Johan Hjort

Njaaa, det skulle vara Next inte End :P,
men nu så funkade det.

Tack :)


Svara

Sv: Loop-problem

Postades av 2003-08-24 00:42:37 - Andreas Hillqvist

MAn behöver ju inte deklarera en variabel:
<code>
Function str(Text As String, Times As Integer) As String
Dim i As Integer
For i = 1 To Times
str = str & Text
Next
End Function
</code>
Fast det är inget effektivt att slå samman större eller många strängar på detta sättet. Eftersom den måste alokeras om för varje loop då den blir större och inte får plats. Det är då effektivare att första alokera plats för variabeln och sedan fylla den:
<code>
Function str(Text As String, Times As Integer) As String
Dim i As Integer, l As Integer, p As Integer
p = 1
l = Len(Text)
str = Space(l * Times)
For i = 1 To Times
Mid(str, p, l) = Text
p = p + l
Next
End Function
</code>
Små och/eller få gånger är skillnaden försumbar. Har för mig att skillnaden sedan är exponensiell med strängens storlek.

Det finns ju en redan en string() funktion som funkar med ett texken:
<code>
MsgBox "hej" & String$( 4,"x") & "då"
</code>


Svara

Sv: Loop-problem

Postades av 2003-08-25 10:32:29 - Niklas Jansson

<b>>Det är då effektivare att första alokera plats för variabeln och sedan fylla den:
>...
>Mid(str, p, l) = Text
>... </b>

Att använda Mid utan $ bör väl inte vara så där överdrivet effektivt. Först omvandling till Variant och sen omvandling tillbaks.

>Har för mig att skillnaden sedan är exponensiell med strängens storlek.
Njae... exponentiell tillväxt är inte rimligt.. Det rör sig om en tid som är proportionell mot kvadraten på antalet gånger, men linjärt mot längden på strängen.


Svara

Sv: Loop-problem

Postades av 2003-08-25 11:06:15 - Andreas Hillqvist

Mattematik är inte min starka sida. Skillnaderna med Mid() statement som tar emot stränge eller variant anser jag försumbara. Vill bar visa principen.

Litet test:
<code>
Option Explicit

Private Declare Function GetTickCount Lib "kernel32" () As Long

Function str1(text As String, Times As Long) As String
Dim i As Long
For i = 1 To Times
str1 = str1 & text
Next
End Function

Function str2(text As String, Times As Long) As String
Dim i As Long, l As Long, p As Long
p = 1
l = Len(text)
str2 = Space(l * Times)
For i = 1 To Times
Mid(str2, p, l) = text
p = p + l
Next
End Function

Function str3(text As String, Times As Long) As String
Dim i As Long, l As Long, p As Long
p = 1
l = Len(text)
str3 = Space(l * Times)
For i = 1 To Times
Mid(str3, p, l) = text
p = p + l
Next
End Function


Private Sub Command1_Click()
Dim text As String
Dim Index As Long
Dim Times As Long
Dim Length As Long
Dim Data As Variant
Dim StartTime As Long
Data = Array(100, 1000, 10000, 100000)
For Index = LBound(Data) To UBound(Data)
Times = Data(Index)

For Length = 1 To 5
text = String(Length, "x")
StartTime = GetTickCount
str1 text, Times
str1 text, Times
str1 text, Times
str1 text, Times
str1 text, Times
List1.AddItem "str1 (Times: " & Times & ", Length: " & Length & "): " & GetTickCount() - StartTime

StartTime = GetTickCount
str2 text, Times
str2 text, Times
str2 text, Times
str2 text, Times
str2 text, Times
List1.AddItem "str2 (Times: " & Times & ", Length: " & Length & "): " & GetTickCount() - StartTime

StartTime = GetTickCount
str3 text, Times
str3 text, Times
str3 text, Times
str3 text, Times
str3 text, Times
List1.AddItem "str3 (Times: " & Times & ", Length: " & Length & "): " & GetTickCount() - StartTime
Next
Next
End Sub
</code>
Vilket ger följande resultat hoss mig:

'100
str1 (Times: 100, Length: 1): 0
str2 (Times: 100, Length: 1): 0
str3 (Times: 100, Length: 1): 0

str1 (Times: 100, Length: 2): 0
str2 (Times: 100, Length: 2): 0
str3 (Times: 100, Length: 2): 0

str1 (Times: 100, Length: 3): 0
str2 (Times: 100, Length: 3): 0
str3 (Times: 100, Length: 3): 0

str1 (Times: 100, Length: 4): 0
str2 (Times: 100, Length: 4): 10
str3 (Times: 100, Length: 4): 0

str1 (Times: 100, Length: 5): 0
str2 (Times: 100, Length: 5): 0
str3 (Times: 100, Length: 5): 0

'1000
str1 (Times: 1000, Length: 1): 10
str2 (Times: 1000, Length: 1): 10
str3 (Times: 1000, Length: 1): 0

str1 (Times: 1000, Length: 2): 20
str2 (Times: 1000, Length: 2): 10
str3 (Times: 1000, Length: 2): 0

str1 (Times: 1000, Length: 3): 30
str2 (Times: 1000, Length: 3): 10
str3 (Times: 1000, Length: 3): 0

str1 (Times: 1000, Length: 4): 40
str2 (Times: 1000, Length: 4): 10
str3 (Times: 1000, Length: 4): 0

str1 (Times: 1000, Length: 5): 70
str2 (Times: 1000, Length: 5): 0
str3 (Times: 1000, Length: 5): 0

'10000
str1 (Times: 10000, Length: 1): 1973
str2 (Times: 10000, Length: 1): 40
str3 (Times: 10000, Length: 1): 40

str1 (Times: 10000, Length: 2): 4206
str2 (Times: 10000, Length: 2): 40
str3 (Times: 10000, Length: 2): 41

str1 (Times: 10000, Length: 3): 6589
str2 (Times: 10000, Length: 3): 40
str3 (Times: 10000, Length: 3): 40

str1 (Times: 10000, Length: 4): 8452
str2 (Times: 10000, Length: 4): 40
str3 (Times: 10000, Length: 4): 40

str1 (Times: 10000, Length: 5): 10546
str2 (Times: 10000, Length: 5): 40
str3 (Times: 10000, Length: 5): 40

Jag drar slutsatsen att skilnaden är försumbar vid få antal upprepningar och/eller små texter. Men man bör tänka sig för när man ska behandla fler antal eller störe texter.


Svara

Sv: Loop-problem

Postades av 2003-08-25 11:23:35 - Niklas Jansson

<b>>Skillnaderna med Mid() statement som tar emot stränge eller variant anser jag försumbara. Vill bar visa principen.</b>
Men du har inte gjort någon jämförelse. Koden för str2 och str3 är ju identisk... Man kan ju inte anse något vara försumbart om man inte testar.

<b>>Jag drar slutsatsen att skilnaden är försumbar vid få antal upprepningar och/eller små texter. Men man bör tänka sig för när man ska behandla fler antal eller störe texter.</b>

För textens storlek är det ingen skillnad. Dubblar man textens längd så dubblar man tiden. Däremot är antalet kopior avgörande. (sen får man ju tänka på att de allra flesta optimeringar inte har betydelse med dagens datorer ändå...)


Svara

Sv: Loop-problem

Postades av 2003-08-25 15:24:00 - Andreas Hillqvist

Du kan ju göra ett test själv mellan Mid() och Mid$() statment. Se om du hittar någon markant skillnad.

För övrigt tycker jag man alltid bör tänka på att skriva effektiv kod. Effektiv kod skriver man genom att veta vad som tar resurser i koden.

Jag tycker inte du tillfört så mycket postivkritik. Utan mer bara klagar.


Svara

Sv: Loop-problem

Postades av 2003-08-25 15:39:48 - Niklas Jansson

Jag hade inte möjlighet att testa, eftersom jag satt på jobbet och VBA inte klarar tilldelningar av typen Mid(...)="...". Jag har nu testat, och det tycks inte vara någon skillnad. Frågan är om VB överhuvudtaget gör en typomvandling i detta fallet.


Jo, visst skall man försöka skriva effektiv kod, men i många fall är det - i och med dagens datorer - onödigt att optimera hårt om man gör koden svårare att förstå eller underhålla.

Syftet är inte att klaga och jag förstår inte varför du tycker att jag klagar. Det enda jag gjort är att ge en generell syn på variant vs string, och klargjort att det inte är en exponentiell tillväxt per stränglängd utan en linjär (syns ju dessutom tydligt på resultaten...), men att det däremot växer aningen starkare än kvadratiskt per antalet kopior.


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 153
27 952
271 704
969
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies