Conversion CDbl et temps de réponse

Résolu
Bernardo769 Messages postés 18 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 9 août 2012 - 15 avril 2012 à 12:42
Bernardo769 Messages postés 18 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 9 août 2012 - 15 avril 2012 à 18:09
Bonjour,

Je rencontre un problème de temps de réponse en mode débogage.
Lors du chargement d'un fichier (9800 lignes), je découpe chaque enregistrement pour alimenter les variables correspondantes. Voici un extrait du code :


Imports System.IO
Imports System.Text.RegularExpressions
Imports System.Math


Dim datas() As String = Split(currentDataGPS, ",")

' Test de temps de réponse...
Dim x1, x2, x3, x4, x5 As String
x1 = Regex.Replace(datas(8), "\.", ",")
x2 = Regex.Replace(datas(10), "\.", ",")
x3 = Regex.Replace(datas(12), "\.", ",")
x4 = Regex.Replace(datas(13), "\.", ",")
x5 = Regex.Replace(datas(14), "\.", ",")
'
Dim monStopWatch As New Stopwatch
monStopWatch.Start()

Dim y1, y2, y3, y4, y5 As Double
y1 = CDbl(x1)
y2 = CDbl(x2)
y3 = CDbl(x3)
y4 = CDbl(x4)
y5 = CDbl(x5)

monStopWatch.Stop()
Console.WriteLine("Traitement = " & monStopWatch.ElapsedMilliseconds)

En mode débogage, j'obtiens un temps de 60ms !!!!! Ce qui donne pour l'ensemble des enregistrements à traiter quasiment 10 minutes!!!


Lorsque je génère l'application, en lançant le programme.exe correspondant, le chargement du même fichier (c'est à dire le traitement des 9800 lignes) donne 10s!!!! Ce qui est raisonnable.


Mes questions :
Pour quelle raison les temps de traitement de cette instruction en mode débogage sont-ils si mauvais!!!

Les temps de réponses n'ont pas toujours été aussi mauvais. C'est seulement aujourd'hui que je constate ce problème après avoir laissé ce programme de côté depuis quelques jours. Entre temps, je n'ai pas le sentiment d'avoir fait quoique ce soit sur mon poste qui aurait dû avoir une influence. Qu'est ce qui c'est passé?...

Si vous avez une idée...
Olivier BERNARD
A voir également:

9 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
15 avril 2012 à 14:38
Bonjour,

Voir si en remplaçant
Regex.Replace(datas(8), "\.", ",")
Par
datas(8).Replace".",",")
Si ça améliore les perfs.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
3
Utilisateur anonyme
15 avril 2012 à 17:22
Bonjour,

Pour tester le résultat éventuel d'une expression régulière sur un texte tu peux utiliser cet outil gratuit.
3
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
15 avril 2012 à 17:27
Bonjour,

Le code n'est pas :
datas(8).Replace("\.", ",")
Mais
datas(8).Replace(".", ",")

Replace remplace, et n'utilise pas d'expression régulière.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
3
Bernardo769 Messages postés 18 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 9 août 2012
15 avril 2012 à 14:10
Précision : Lord de l'exécution du traitement, au bout de 60s, j'ai un message :

ContextSwitchDeadlock a été détecté
Message: Le CLR n'a pas pu effectuer de transition du contexte COM 0x54c868 au contexte COM 0x54c9d8 pendant 60 secondes.
Le thread qui possède le contexte/cloisonnement de destination est probablement en train d'attendre
ou de traiter une opération très longue sans pompage des messages Windows.
Cette situation a généralement des effets négatifs sur les performances
et peut parfois entraîner le blocage de l'application
ou une utilisation ininterrompue de la mémoire.

Pour éviter ce problème,
tous les threads STA (Single Threaded Apartment) doivent utiliser des primitives d'attente de pompage (par exemple CoWaitForMultipleHandles)
et pomper de manière régulière les messages lors des opérations qui sont longues à s'exécuter.

Je clique sur "Continuer" et le traitement continue pendant encore 9 longues minutes...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bernardo769 Messages postés 18 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 9 août 2012
15 avril 2012 à 15:05
Bien vu. ça marche beaucoup mieux maintenant. Merci.

Par contre, dans l'analyse que j'ai faite du problème, j'ai plutôt identifié la conversion en double comme problématique. En comparant les 2 exemples :

x1 = Regex.Replace(datas(8), "\.", ",")
et
x1 = datas(8).Replace("\.", ",")

Le résultat est très comparable en temps d'exécution et en résultat (variable de type string correctement formatée sans espaces ni au début ni à la fin).
Alors pour quelle raison la commande CDbl réagit de manière différente? Est-ce qu'il y a une explication?

Olivier BERNARD
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
15 avril 2012 à 15:14
Bonjour,

Je ne vois pas pourquoi il y a autant de changement.
Sinon, peut être que Double.Parse irais mieux ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualVasic (onglet Références dans les propriétés du projet).
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
0
Bernardo769 Messages postés 18 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 9 août 2012
15 avril 2012 à 17:00
Voilà ce que j'ai testé :

avec :

Dim x1, x2, x3, x4, x5 As String
x1 = Regex.Replace(datas(8), "\.", ",")
x2 = Regex.Replace(datas(10), "\.", ",")
x3 = Regex.Replace(datas(12), "\.", ",")
x4 = Regex.Replace(datas(13), "\.", ",")
x5 = Regex.Replace(datas(14), "\.", ",")
'
Dim monStopWatch As New Stopwatch
monStopWatch.Start()

Dim y1, y2, y3, y4, y5 As Double
y1 = Double.Parse(x1)
y2 = Double.Parse(x2)
y3 = Double.Parse(x3)
y4 = Double.Parse(x4)
y5 = Double.Parse(x5)

monStopWatch.Stop()
Console.WriteLine("Traitement " & monStopWatch.ElapsedMilliseconds)
> EXCEPTION : Le format de la chaîne d'entrée est incorrect.


avec :

' Test de temps de réponse...
Dim x1, x2, x3, x4, x5 As String
x1 = datas(8).Replace("\.", ",")
x2 = datas(10).Replace("\.", ",")
x3 = datas(12).Replace("\.", ",")
x4 = datas(13).Replace("\.", ",")
x5 = datas(14).Replace("\.", ",")
'
Dim monStopWatch As New Stopwatch
monStopWatch.Start()

Dim y1, y2, y3, y4, y5 As Double
y1 = Double.Parse(x1)
y2 = Double.Parse(x2)
y3 = Double.Parse(x3)
y4 = Double.Parse(x4)
y5 = Double.Parse(x5)

monStopWatch.Stop()
Console.WriteLine("Traitement " & monStopWatch.ElapsedMilliseconds)
> Pas de plantage, temps d'exécution = 0ms

Le Regex.replace() ne renvoie pas la même chose que le String.replace()

Olivier BERNARD
0
Utilisateur anonyme
15 avril 2012 à 17:12
Bonjour,

ContextSwitchDeadlock a été détecté

Tu peux te débarrasser de cette ânerie-là en faisant ce qu'ils disentdans cet article.

Si au moins ces imbéciles s'arrangeaient pour ne pas bloquer le programme avec ce gugusse-là
0
Bernardo769 Messages postés 18 Date d'inscription mercredi 13 janvier 2010 Statut Membre Dernière intervention 9 août 2012
15 avril 2012 à 18:09
Judicieuse remarque :

Le code n'est pas :
datas(8).Replace("\.", ",")
Mais
datas(8).Replace(".", ",")


Ce qui veut dire que :
* Je n'ai pas besoin de .Replace(".", ",") avant de convertir ma chaine pour la passer en numérique. Par exemple : "43.614494"
* Dans l'expression CDbl(datas(8).Replace(".", ",")), le .Replace(".", ",") ne fait pas son travail. Sinon, j'aurais eu un plantage comme cela m'est arrivé en testant avec 2 instructions séparées (après avoir corrigé ma petite erreur)...

Je vais corriger mon code . Merci pour vos réponses.

Pour tester les regex, je connaissait RegexSR.
Olivier BERNARD
0
Rejoignez-nous