Conversion CDbl et temps de réponse [Résolu]

Messages postés
18
Date d'inscription
mercredi 13 janvier 2010
Dernière intervention
9 août 2012
- - Dernière réponse : Bernardo769
Messages postés
18
Date d'inscription
mercredi 13 janvier 2010
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
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Messages postés
14316
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
5 décembre 2018
3
Merci
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

Merci NHenry 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de NHenry
3
Merci
Bonjour,

Pour tester le résultat éventuel d'une expression régulière sur un texte tu peux utiliser cet outil gratuit.

Merci Utilisateur anonyme 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
14316
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
5 décembre 2018
3
Merci
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

Merci NHenry 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de NHenry
Messages postés
18
Date d'inscription
mercredi 13 janvier 2010
Dernière intervention
9 août 2012
0
Merci
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...
Commenter la réponse de Bernardo769
Messages postés
18
Date d'inscription
mercredi 13 janvier 2010
Dernière intervention
9 août 2012
0
Merci
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
Commenter la réponse de Bernardo769
Messages postés
14316
Date d'inscription
vendredi 14 mars 2003
Dernière intervention
5 décembre 2018
0
Merci
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
Commenter la réponse de NHenry
Messages postés
18
Date d'inscription
mercredi 13 janvier 2010
Dernière intervention
9 août 2012
0
Merci
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
Commenter la réponse de Bernardo769
0
Merci
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à
Commenter la réponse de Utilisateur anonyme
Messages postés
18
Date d'inscription
mercredi 13 janvier 2010
Dernière intervention
9 août 2012
0
Merci
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
Commenter la réponse de Bernardo769

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.