Toon posts:

[VB6sp6]Performance van applicatie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben de laatste tijd bezig met een herbouw van onze analyse-programma.
Daar heb ik al menig post over geschreven ;)
Inmiddels is 80% klaar en moet ik tot mijn spijt betuigen dat ik waarschijnlijk totaal verkeerd bezig ben. De performance is nl. beroerd.
Als vergelijking heb ik het huidige programma dat in Delphi is geschreven. De reden dat we nu in VB6 bouwen is dat de kennis van Delphi inmiddels vertrokken is.

Ik zal eerst even in het kort uitleggen wat het programma moet doen.

We voeren meetwerk uit en die meetgegevens worden in tekstbestanden opgeslagen. Elke 20 minuten een nieuw bestand. De indeling van zo'n tekstbestand is eerst een regel met GPS-info, dan een regel met de meetgegevens. De verschillende gegevens zijn door ; gescheiden. De eerste regel bestaat uit 10 variabelen, de tweede uit 512 variabelen.

Doel van het programma is om de meetbestanden in te lezen, te tonen op het scherm (grafisch) zodat eventueel punten verwijderd kunnen worden. Vervolgens worden de meetgegevens (tweede regel) geanalyseerd. De uitkomst van die analyse bestaat uit 5 variabelen.
Deze 5 variabelen samen met de GPS-gegevens (eerste regel) worden het nieuwe databestand, maar nu deze gegevens op 1 regel en in Excel formaat.

Ik had bedacht om alle variabelen via in-memory recordsets (recordset zonder database-connectie) te benaderen.

Dus wat ik eerst doe is de meetbestanden inlezen in een recordset, maar daarbij de meetgegevens (tweede regel) in z'n geheel in een kolom, omdat ik op dit moment nog niets doe met die gegevens.
Vervolgens toon ik deze recordset in een MSFlexgrid en in een ActiveX-component die makkelijk GPS-data kan tonen.
De gebruiker kan nu punten verwijderen.
Performance is nog goed:
LeesOpgeslagenData duurde: 0:2 minuten
Form_Load duurde: 0:1 minuten

De volgende stap is om meetfouten uit te sluiten. Daarvoor maken we gebruik van een 'running average'. De gebruiker geeft aan over hoeveel records (bijv. 4) en de applicatie gaat van record 1 tm 4 alle velden middelen, vervolgend 2 tm 5, enz.
Voordat dit gedaan kan worden moet de kolom met meetgegevens (tweede regel) worden opgesplitst in afzondelijke velden in de recordset.
Omdat aan een geopende recordset geen velden toegevoegd mogen worden, maak ik een nieuwe door de structuur van de orginele te nemen, de velden toe te voegen, vervolgens loop ik door de orginele recordset heen en voeg de waarden toe aan de nieuwe recordset. Dan ga ik naar de kolom waar alle meetgegevens in staat, splits die in afzondelijke waarden en vul die in in de nieuwe velden.
Dit is erg omslachtig en duurt ook lang:
splitsMeetgegevens duurde: 0:37 minuten

Nu heb ik dus een recordset van ca. 600 velden en 1600 records met alle data die ik nodig heb.
Op deze recordset ga ik de running average toepassen. Dit duurt nog veel langer:
berekenRunningAverage duurde: 2:46 minuten

En dan te bedenken dat 1600 records echt het minimum is, dit kan wel oplopen tot 20.000 records.

De oude programmatuur doet het min of meer op dezelfde wijze alleen dan niet in een recordset maar in een array en worden de meetgegevens niet gesplitst maar blijft ook dat een array.
De totale duur van deze 1600 records in het oude progamma is ca. 10 seconden.

Graag verneem ik waar ik de fout in ben gegaan en of er andere manieren zijn om dit op te lossen.
Overschakelen op een andere programmeertaal dan VB6sp6 is geen optie.

  • Twee Dee
  • Registratie: Juli 2002
  • Laatst online: 23:05

Twee Dee

Morgen weer een ondertitel.

Hoe bereken je het running average?
Als je dit doet door steeds 4 waarden op te tellen en te delen door 4 dan moet je hiervoor iets beters verzinnen. Er bestaat een algoritme waarmee je steeds 1 waarde kan toevoegen en het nieuwe gemiddelde kan berekenen. Ik heb nu even niet zoveel tijd om het op te zoeken, maar Google kan vast wel helpen :)

Luister nou gewoon naar me, dat voorkomt dat ik later "zie je wel" moet zeggen.


Verwijderd

Topicstarter
Ik had ook al gezocht, maar kon niets bruikbaars vinden.
Hier is mijn code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Public Function berekenRunningAverage(rst As ADODB.Recordset, _
iWindowSize As Integer) As ADODB.Recordset
'Bereken aan de hand van de windowsize de running average
'Running average middeld een aantal (windowsize) records,
'de eerste gaat van 1 tot windowsize, de tweede van 2 tot windowsize+1, enz.
'Er is een array nodig met grootte = windowsize, van de inhoud van deze array wordt
'het gemiddelde berekent en dit gemiddelde wordt in het grid getoont.
'Vervolgens wordt de eerste verwijderd en de volgende toegevoegd.
Dim i As Integer, j As Integer
Dim gemiddelde As Double
Dim row As Integer, iRecord As Integer
Dim rstRunningAverage As New ADODB.Recordset
Dim dTimerStart As Date, dTimerEind As Date
  
  'Kopieer structuur recordset:
  Set rstRunningAverage = kopieerStructuurRecordset(rst)
  rstRunningAverage.Open
  
  'Init:
  dTimerStart = Now
  
  'Eerste keer vullen,
  'maar wel 1 minder zodat de 'gewone' routine eerst nog
  '1 kan toevoegen
  rst.MoveFirst
  For j = 0 To iWindowSize - 2
    rstRunningAverage.AddNew
    For i = 0 To rst.Fields.Count - 1
      If rst.Fields(i).Name <> "spectrum" Then
        rstRunningAverage.Fields(i).Value = rst.Fields(i).Value
      End If
    Next i
    rstRunningAverage.Update
    rst.MoveNext
  Next j
  
  'Tot iWindowSize - 2 zit er al in,
  'dus beginnen bij de volgende => iWindowSize - 1 :
  For iRecord = iWindowSize - 1 To rst.RecordCount - 1
    'eerst kijken of recordset van running average niet vol is:
    If rstRunningAverage.RecordCount = iWindowSize Then
      rstRunningAverage.MoveFirst
      rstRunningAverage.Delete adAffectCurrent
    End If
    'vervolgens nieuw record toevoegen:
    rstRunningAverage.AddNew
    For i = 0 To rst.Fields.Count - 1
      If rst.Fields(i).Name <> "spectrum" Then
        rstRunningAverage.Fields(i).Value = rst.Fields(i).Value
      End If
    Next i
    rstRunningAverage.Update
    'Nu running average berekenen:
    For i = 0 To rstRunningAverage.Fields.Count - 1
      gemiddelde = 0
      rstRunningAverage.MoveFirst
      If rstRunningAverage.Fields(i).Name <> "spectrum" Then
        For j = 0 To rstRunningAverage.RecordCount - 1
          gemiddelde = gemiddelde + rstRunningAverage(i).Value
          rstRunningAverage.MoveNext
        Next j
        gemiddelde = gemiddelde / rstRunningAverage.RecordCount
      End If '<> "spectrum"
    Next i
    
  Next iRecord
  
  'Klaar
  rstRunningAverage.Close
  Set rstRunningAverage = Nothing
  
  dTimerEind = Now
  'Misbruiken variabele:
  dTimerEind = DateDiff("s", dTimerStart, dTimerEind)
  Debug.Print "berekenRunningAverage duurde: " & Int(dTimerEind / 60) & _
":" & dTimerEind Mod 60 & " minuten"
end function

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 01:17
Als je die recordset niet echt nodig hebt moet je ze niet gebruiken. Waarschijnlijk duurt het benaderen van een element in een recordset behoorlijk lang. Probeer de gegevens eens in een array of zelf geschreven class te stoppen. Deze kan je dan bovendien mutable maken.

Over het running average: ik denk niet dat het algoritme echt de bottle neck is aangezien het maar om 4 elementen gaat. Een manier om het sneller te doen is

code:
1
2
3
4
5
6
7
'pseudocode

runningavg = (d[1] + d[2] +d[3] +d[4]) /4

for i = 5 to sizeofdata
  runningavg = runningavg + (d[i] - d[i-4])/4
end

Verwijderd

Topicstarter
@Sjaaky:
Met classes ben ik nog niet zo handig. En ik heb het al met een array geprobeerd maar dan heb ik het probleem dat mijn array steeds groter wordt omdat als ik een element eruit gooi de index niet wordt geupdate. Maar misschien is dit toch wel een optie. Ik zal het in ieder geval nog eens proberen.

  • Mart!
  • Registratie: Februari 2000
  • Laatst online: 25-05 15:37
Voordat je uberhaupt naar totaal andere oplossingen gaat kijken zou ik eerst wat meer metingen doen op de verschillende onderdelen in je programma. Begin eerst met die delen van het programma die relatief veel tijd in beslag nemen en optimaliseer deze. Ook bij programmeren en performance geldt namelijk vaak de 80-20 regel --> 20% van de code neemt 80% van de tijd in beslag en visa versa.

Wanneer dit geen oplossing biedt, is omprogrammeren naar gebruik van arrays de volgende stap. Ik vermoedt dat de disconnected recordsets de performance flink naar beneden halen....

Verwijderd

Topicstarter
Ik heb de performance gemeten van de functie die ik hir boven heb gepost. Die duurde ook het langst.
De totale tijd is 3 min 24 sec.
rst.RecordCount = 1558
rst.fields.Count = 556

Als ik alleen het blok code van regel 39 t/m regel 52 dus alleen het invullen van de tijdelijke recordset (rstRunningAverage) dan duurt dit voor 100 records: 2 sec. Dus voor 1500 records ca. 30 sec.

Als ik meet van regel 39 t/m regel 66 dan duurt het 13 seconden, dit is inclusief de eerdere 2 sec. In totaal voor de 1500 records komt dat dan wel op die 3 minuten.

Nu weet ik waar de problemen zit, maar ik weet nog geen oplossing.
Volgens mij geeft het gebruik van array's ook de nodige problemen, omdat ik niet alleen de waarden nodig heb maar ook de kolomnamen. Dat is ook de reden dat ik met recordsets ben begonnen.

Ik heb inmiddels 3 boeken van vb6 op mijn bureau. Ik heb het eerste boek (MS VB6 Fundamentals) bijna uit, maar ik ben nog niets tegen gekomen over classes. Ik weet dan ook niet of classes een oplossing zijn zoals Sjaaky voorstelde.

Ik ga zo eerst een test maken die door array's heen loopt en kijkt of de performance beter is, voordat ik me op het ombouwen naar array's stort.
Graag lees ik of er nog andere opties zijn ;)

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 01:17
Ik denk dat je alleen al door de de for lussen van regel 54 en 58 te verwisselen een stuk aan snelheid wint. Dus in de buitenste lus over de records lopen en in de binnenste lus over de fields, ipv andersom.

Ik weet ook pas sinds kort dat classes in vb ook geen snelheidsmonsters zijn om het maar even zacht uit te drukken. Dus of je antwoord daar ligt, ik weet het niet. Is er een VB equivalent voor de C struct?

Mag ik eigenlijk vragen waarom je uberhaupt de applicatie opnieuw schrijft? Alleen omdat die collega is vertrokken? Omdat er kleine wijzigingen in moeten komen? Of omdat de oude app echt niet meer voldoet en herschrijven in vb beter is dan delphi leren en verder te proggen bovenop de oude app?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Sjaaky schreef op 15 mei 2004 @ 03:08:
Is er een VB equivalent voor de C struct?
Een user defined type is wat je bedoelt denk ik...

code:
1
2
3
4
5
6
Private Type Computer
  MHZ as Long
  Name as String * 150
  IP(4) as Byte
  Cost as Currency
End Type

En dan ergens in je code:
code:
1
2
3
4
5
6
7
8
9
10
11
    Dim MyComp As Computer
    
    With MyComp
        .IP(0) = 192
        .IP(1) = 168
        .IP(2) = 0
        .IP(3) = 11
        .MHZ = 2800
        .Name = "PC-RobIII"
        .Cost = 5340.35
    End With

Dit is natuurlijk gewoon verzonnen voorbeeld-data, dat snap je :P

Verder heb ik het topic maar licht over gekeken (het is nu te laat om m'n hersens weer op gang te brengen :P ), maar ik heb wel wat opmerkingen voor je:

• VB is niet 's werelds snelste taal, maar voldoet vaak prima (de eeuwige discussies over VB ken ik echt wel, ik wil er dan ook hier niet aan beginnen)
• Arrays zullen wel wat sneller zijn, maar classes (mits goed geïmplementeerd!) hebben ook hun voordelen. Verdiep je er eens in en er gaat een wereld voor je open
• Recordsets hebben ook zo hun eigen voordelen. Disconnected Recordsets hebben weer andere voordelen

Weeg alles eens tegen elkaar af, of beter: probeer met wat testroutines (m.b.v. bijvoorbeeld een for-loop met 1.000.000 iteraties) wat voor jou het snelst zal werken en ga dan pas beginnen met het echte implementeren van wat je wil.

Just my €0.02 (of €0.0238 inclusief BTW)

[edit]
Bijna vergeten te melden: De reden waarom ik dit topic las was omdat er SP6 in de titel stond. Dan wil ik je meteen even "waarschuwen" / "voor zijn": [rml]RobIII: Waarschuwing[/rml] uit [rml][ VStudio6] Service Pack 6 komt eraan (eindelijk)[/rml]

Zie eventueel nog wat ik in microsoft.public.vb.bugs heb gepost

[ Voor 33% gewijzigd door RobIII op 15-05-2004 03:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • PolarBear
  • Registratie: Februari 2001
  • Niet online
Is het wellicht een optie om over te gaan op Visual Basic.net. Dat is nog wel de taal die het meeste op VB6 lijkt. Het is vergezocht en omslachtig, maar .Net biedt meestal een betere performance.

Verwijderd

PolarBear schreef op 15 mei 2004 @ 08:24:
Is het wellicht een optie om over te gaan op Visual Basic.net. Dat is nog wel de taal die het meeste op VB6 lijkt. Het is vergezocht en omslachtig, maar .Net biedt meestal een betere performance.
offtopic:
eeeeeh, Microsoft heeft bij het uitkomen van VB.Net gezegd dat de performance gemiddeld 10%-20% Lager was dan in VB6.


Maar verder een paar tips m.b.t. optimalisatie :
- Gebruik zo veel mogelijk With statements, die zorgen ervoor dat er minder object-referenties af worden gegaan, wat in lussen veel kan schelen.

- Een ADO-Recordset heeft een undocumented method Collect(index) die hetzelfde doet als een recordset.fields(index).value voor het ophalen van gegevens, maar dan sneller ( ook hier weer, in lussen zul je daar het meeste van merken )

- Gezien het feit dat je in al je lussen het veld met de naam "Spectrum" uitsluit, zorg er dan voor dat dit veld al niet in je recordset zit ! Dat scheelt je een hoop If-statements.

- "For i = 0 to rst.fields.count - 1" zorgt ervoor dat bij iedere doorgang van de lus "rst.fields.count - 1" opnieuw wordt geevalueerd. Zet de waarde eerst in een variabele, en gebruik die in de for-statement.

- In de laatste lus ('Nu running average berekenen: ) kun je waarschijnlijk beter het afgaan van de records in de buitenste lus zetten, en het afgaan van de velden in de binnenste. Je hebt dan maar 1 MoveFirst nodig ( i.p.v. [aantal velden * movefirst ]) en [aantal records *movenext] nodig ( i.p.v. [Aantal velden * aantalRecords * movenext] ).

- Verder zou je eens kunnen kijken of een "Do while not rst.eof" lus misschien wel sneller is dan "For i = 0 To rst.Fields.Count - 1"

- enne.......Doet deze functie wel iets ? Je berekent wel het gemiddelde, maar ik zie nergens waar je hem opslaat !

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
PolarBear schreef op 15 mei 2004 @ 08:24:
Is het wellicht een optie om over te gaan op Visual Basic.net. Dat is nog wel de taal die het meeste op VB6 lijkt. Het is vergezocht en omslachtig, maar .Net biedt meestal een betere performance.
Tjee wat een onzin wederom. Laat me eens cijfers zien, want ik ben er nog altijd van overtuigd dat VB.NET stukken langzamer is dan VB6.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 18:25

Sponge

Serious Game Developer

Verwijderd schreef op 13 mei 2004 @ 16:54:
Ik had ook al gezocht, maar kon niets bruikbaars vinden.
Hier is mijn code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Public Function berekenRunningAverage(rst As ADODB.Recordset, _
iWindowSize As Integer) As ADODB.Recordset
'Bereken aan de hand van de windowsize de running average
'Running average middeld een aantal (windowsize) records,
'de eerste gaat van 1 tot windowsize, de tweede van 2 tot windowsize+1, enz.
'Er is een array nodig met grootte = windowsize, van de inhoud van deze array wordt
'het gemiddelde berekent en dit gemiddelde wordt in het grid getoont.
'Vervolgens wordt de eerste verwijderd en de volgende toegevoegd.
Dim i As Integer, j As Integer
Dim gemiddelde As Double
Dim row As Integer, iRecord As Integer
Dim rstRunningAverage As New ADODB.Recordset
Dim dTimerStart As Date, dTimerEind As Date
  
  'Kopieer structuur recordset:
  Set rstRunningAverage = kopieerStructuurRecordset(rst)
  rstRunningAverage.Open
  
  'Init:
  dTimerStart = Now
  
  'Eerste keer vullen,
  'maar wel 1 minder zodat de 'gewone' routine eerst nog
  '1 kan toevoegen
  rst.MoveFirst
  For j = 0 To iWindowSize - 2
    rstRunningAverage.AddNew
    For i = 0 To rst.Fields.Count - 1
      If rst.Fields(i).Name <> "spectrum" Then
        rstRunningAverage.Fields(i).Value = rst.Fields(i).Value
      End If
    Next i
    rstRunningAverage.Update
    rst.MoveNext
  Next j
  
  'Tot iWindowSize - 2 zit er al in,
  'dus beginnen bij de volgende => iWindowSize - 1 :
  For iRecord = iWindowSize - 1 To rst.RecordCount - 1
    'eerst kijken of recordset van running average niet vol is:
    If rstRunningAverage.RecordCount = iWindowSize Then
      rstRunningAverage.MoveFirst
      rstRunningAverage.Delete adAffectCurrent
    End If
    'vervolgens nieuw record toevoegen:
    rstRunningAverage.AddNew
    For i = 0 To rst.Fields.Count - 1
      If rst.Fields(i).Name <> "spectrum" Then
        rstRunningAverage.Fields(i).Value = rst.Fields(i).Value
      End If
    Next i
    rstRunningAverage.Update
    'Nu running average berekenen:
    For i = 0 To rstRunningAverage.Fields.Count - 1
      gemiddelde = 0
      rstRunningAverage.MoveFirst
      If rstRunningAverage.Fields(i).Name <> "spectrum" Then
        For j = 0 To rstRunningAverage.RecordCount - 1
          gemiddelde = gemiddelde + rstRunningAverage(i).Value
          rstRunningAverage.MoveNext
        Next j
        gemiddelde = gemiddelde / rstRunningAverage.RecordCount
      End If '<> "spectrum"
    Next i
    
  Next iRecord
  
  'Klaar
  rstRunningAverage.Close
  Set rstRunningAverage = Nothing
  
  dTimerEind = Now
  'Misbruiken variabele:
  dTimerEind = DateDiff("s", dTimerStart, dTimerEind)
  Debug.Print "berekenRunningAverage duurde: " & Int(dTimerEind / 60) & _
":" & dTimerEind Mod 60 & " minuten"
end function
Enkele tips:

- StrComp(string1, string2, vbTextCompare) = 0 voor string vergelijken
- Dim I as Long, J as Long
- Cache "To rst.RecordCount -1", zet die recordcoutn in een variabele!!
- Moet je echt elke keer weer opnieuw beginnen met loopen? Kan je niet bij de vorige J/I ergens beginnen?
- Moet gemiddelde een double zijn?
- Heb je echt zoveel database/recordset access nodig? :)
- Gebruik With.

Naja, voor wat meer speedtips kan je in m'n sig kijken :). Dacht dat ik de belangrijkste al heb gehad..

Verwijderd

Topicstarter
@Allemaal:
Geweldig al deze respons.
Ik heb vrijdag mijn code herschreven. ipv recordsets gebruik ik nu arrays en het gaat nu razendsnel.
Ik zal de voorgestelde tuning nog moeten toepassen zoals:
Dim I as Long, J as Long (Thanks Sponge)
De loop-volgorde wijzigen (Sponge, FFrenzy)
StrComp(string1, string2, vbTextCompare) = 0 voor string vergelijken (wederom Sponge)

Hier is mijn gewijzigde code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Public Function berekenRunningAverage(rst As ADODB.Recordset, _
 iWindowSize As Integer) As ADODB.Recordset
'Bereken aan de hand van de windowsize de running average
'Running average middeld een aantal (windowsize) records,
'de eerste gaat van 1 tot windowsize, de tweede van 2 tot windowsize+1, enz.
Dim dTimerStart As Date, dTimerEind As Date
Dim iRecord As Integer, iRA As Integer, iField As Integer
Dim gemField As Double
Dim iRecordCount As Integer, iFieldCount As Integer
Dim arrRunningAverage() As Double
Dim teller As Integer
Dim sDebug As String

  'Init:
  iRecordCount = rst.RecordCount
  iFieldCount = rst.Fields.Count
  'Om de berekende data in op te slaan:
  ReDim arrRunningAverage(iFieldCount, iRecordCount)
  
  'Records bewaren in een array:
  rst.MoveFirst
  'Use the GetRows method to copy records from a Recordset into a
  'two-dimensional array. The first subscript identifies the field and
  'the second identifies the record number. The array variable is automatically
  'dimensioned to the correct size when the GetRows method returns the data.
  arrRecords = rst.GetRows(iRecordCount)
  
  'Veldnamen bewaren in array:
  ReDim arrFields(iFieldCount)
  For i = 0 To iFieldCount - 1
    arrFields(i) = rst.Fields(i).Name
  Next i
  
  'loop door alle records heen:
  For iRecord = 0 To iRecordCount - 1
    'loop door alle velden heen:
    For iField = 0 To iFieldCount - 1
      If arrFields(iField) <> "spectrum" Then
        'per record is de Running Average te berekenen door
        'vooruit te kijken:
        gemField = 0 'init
        'Denk erom dat bij vooruit kijken, er verder (iWindowSize)
        'wordt gekeken dan er data is:
        If iRecord > iRecordCount - iWindowSize Then Exit For
        For iRA = 0 To iWindowSize - 1
          gemField = gemField + arrRecords(iField, iRecord + iRA)
        Next iRA
        'Gemiddelde bewaren:
        arrRunningAverage(iField, iRecord) = gemField
      End If
    Next iField
  Next iRecord    
End Function


Nu duurt deze berekening geen 3 minuten maar slechts 4 seconden!
Prima dus.
Mag ik eigenlijk vragen waarom je uberhaupt de applicatie opnieuw schrijft? Alleen omdat die collega is vertrokken? Omdat er kleine wijzigingen in moeten komen? Of omdat de oude app echt niet meer voldoet en herschrijven in vb beter is dan delphi leren en verder te proggen bovenop de oude app?
De applicatie moet helemaal op z'n kop omdat er veel functionaliteit inzit die we niet gebruiken en er ook functionaliteit ontbreekt. Delphi leren was ook een optie, maar we hebben hiervoor gekozen.
- enne.......Doet deze functie wel iets ? Je berekent wel het gemiddelde, maar ik zie nergens waar je hem opslaat !
Dat gedeelte heb ik niet gepost omdat dat niet echt relevant is in dit geval, uiteraard worden de uitkomsten bewaart.
Pagina: 1