L'optimisme, ce n'est pas le refus de voir ce qui ne va pas, c'est le désir de ne pas s'y attarder. // Donne moi le courage de changer les choses que je peux changer, la sérénité d'accepter celles que je ne peux pas changer, et la sagesse de distinguer entre les deux. (Marc Aurèle) // Don't raise your voice; improve your argument. (Desmond Tutu) // Be the change you want to see in the world. (Gandhi)

8.12.06

Gros problème de performance en VB.NET

Quelques heures passées pour élucider un gros problème de performance !!

Contexte :
- un programme écrit rapidement et qui fonctionne très bien sur un premier jeu de données, devient lent sur un autre jeu et très lent sur un 3ème jeu de données.
- alors que le volume de données est multiplié seulement par 10, les temps de réponse sont exponentiels.

Explication :
Le traitement des string sous VB.NET
Ce qu'il ne faut pas faire.
myString = myString + otherString dans une boucle. Quand le nombre d'itération devient important les performances s'écroulent

Il faut alors passer pas StringBuilder ou bien un tableau .....

Dim iLoop As Integer
Dim iMaxLoop As Integer
Dim sString As String
Dim sBigString As String
Dim dStartTime As DateTime
Dim dEndTime As DateTime
Dim tDuree As TimeSpan

sBigString = ""
sString = "123456789012345678901234567890123456789012345678901234567890"
iMaxLoop = 30000
dStartTime = System.DateTime.Now
Dim MyString As New System.Text.StringBuilder()
For iLoop = 1 To iMaxLoop

MyString.Append(sString)
Next
dEndTime = System.DateTime.Now
tDuree = dEndTime - dStartTime
Console.WriteLine("CAS1")
Console.WriteLine(tDuree)
dStartTime = System.DateTime.Now


Dim MyTab(iMaxLoop) As String
For iLoop = 0 To iMaxLoop - 1
MyTab(iLoop) = sString
Next
dEndTime = System.DateTime.Now
tDuree = dEndTime - dStartTime
Console.WriteLine("CAS2")
Console.WriteLine(tDuree)

dStartTime = System.DateTime.Now
For iLoop = 1 To iMaxLoop
sBigString = sBigString + sString
Next
dEndTime = System.DateTime.Now
tDuree = dEndTime - dStartTime
Console.WriteLine("CAS3")
Console.WriteLine(tDuree)
Console.ReadLine()

Une illustration des performances
Sur une itération à iMaxLoop = 5000
Dans les cas 1 et 2, Duree = 0
Sur le cas 3, Duree = 00:00:00.0937500

Mais sur une itération à iMaxLoop = 30000
Sur les cas 1 et 2, Duree = 00:00:00.015625
Sur le cas 3, Duree = 00:02:01.3373000


No comments: