Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ODBCDOTNET : EXTRAIRE DES REQUETES ODBC DANS UN TABLEAU DE TABLEAUX DE STRING


Information sur la source

Catégorie :Base de Donnees Source .NET ( DotNet ) Classé sous : odbc, sql, navision, db2, excel Niveau : Initié Date de création : 19/11/2005 Date de mise à jour : 13/04/2008 10:39:20 Vu / téléchargé: 14 683 / 4 784

Note :
Aucune note

Commentaire sur cette source (66)
Ajouter un commentaire et/ou une note


Description

Voici une classe pour le requêtage ODBC à vocation universelle : pour cela, on utilise un fichier .dsn (Database Source Name) externe dans lequel on indique le type de la source ODBC à interroger (on peut en générer pour de nombreux types de base de données). L'évolution par rapport à la précédente source XLDB que j'avais présenté il y a quelques mois est que l'on peut maintenant préciser la requête à effectuer aussi dans un fichier externe .sql, de sorte que l'on s'affranchi de la spécificité éventuelle de la source, notamment Excel, pour laquelle il faut ajouter $ à la fin de chaque nom de table (correspondant à chaque feuille Excel) : on peut donc écrire des requêtes spécifiques à chaque source ODBC sans avoir à recompiler le programme. De plus, on peut maintenant effectuer une série de requêtes successives, simplement en séparant les requêtes par un ; comme dans la syntaxe standard de SQL. Pour pouvoir stocker et renvoyer le résultat propre à chaque requête, l'astuce consiste à stocker des tableaux 2D de String dans un tableau conteneur, tout est redimensionné en fonction des requêtes demandées : il suffit alors d'effectuer le traitement d'analyse en dehors de la classe ODBC. L'avantage est que le composant d'accès ODBC gère tout le traitement d'erreur spécifique à ODBC, il ne reste plus qu'à traiter les conversions de valeurs String en fonction de vos besoins propres, c'est de l'ETL ! (Extract, Transform and Load : Extraire, transformer et charger).

Fonctionnalités :
- Nouveau : Explorateur de source de données (tables et champs avec leurs types et tailles) ;
- Utilisation de fichiers .dsn et .sql externes ;
- Création d'un fichier .dsn et .sql par défaut pour Access, Excel, Omnis, DB2 (iSeries d'IBM, anciennement AS/400) via le pilote Client Access, et Navision (Microsoft Business Solutions) via le pilote C/ODBC ;
- Vérification de l'accessibilité effective de la source au moment de l'extraction (pour les sources de type fichier) ;
- Utilisation possible d'une chaîne de connexion directe, par exemple sur un fichier Excel ;
- Gestion des requêtes multiples séparées par des ";" ;
- Gestion de requêtes programmées par le code (au lieu du fichier externe .sql) ;
- Fonctionnement par exemple jusqu'à 254 champs avec le pilote ODBC pour Excel ;
- Avec Excel, les champs calculés sont bien supportés (les valeurs calculées sont retournées comme pour les autres champs) ;
- Requête en écriture si le pilote ODBC le permet ;
- Affichage d'un pourcentage d'avancement ;
- Interruption possible si c'est trop long ;
- Copie des informations dans le presse-papier pour le débogage.

Patrice Dargenton.
 

Source

  • ' Tout le code est dans la String
  • Private Const CODE_STR As String = "5589E583EC185756515352BBxxxxx05x81FB"
  • Public Sub iASMCALL2()
  • Call CallWindowProc(nProcByte, 0, 0, 0, 0)
  • End Sub
' Tout le code est dans la String
Private Const CODE_STR As String = "5589E583EC185756515352BBxxxxx05x81FB"
Public Sub iASMCALL2()
    Call CallWindowProc(nProcByte, 0, 0, 0, 0)
End Sub

Conclusion

http://patrice.dargenton.free.fr/CodesSources/ODBCDotNet.html
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

16 avril 2006 12:00:48 :
Version 1.01 : Génération du DSN pour DB2 (iSeries d'IBM, anciennement AS/400) via le pilote Client Access, et Navision (Microsoft Business Solutions) via le pilote C/ODBC ; Requête en écriture si le pilote ODBC le permet ; Autres améliorations mineures (cf. doc).
05 novembre 2006 10:40:14 :
Version 1.02 : liste des nouveautés : http://patrice.dargenton.free.fr/CodesSources/ODBCDotNet.html#_Toc150483932
11 novembre 2006 09:05:23 :
Version 1.02 bis : petite correction sur le redimensionnement du tableau, 100 lignes par défaut au lieu de 10000, propriété Public pour m_iNbEnregAlloues.
25 novembre 2007 11:17:06 :
Version 1.09 : cf. doc pour la liste des nouveautés.
13 avril 2008 10:32:18 :
V1.11 : Passage en VB 2008, Mode bLireToutDUnBlocRapide amélioré.
13 avril 2008 10:39:20 :
2 fichiers en trop.

Commentaires et avis

signaler à un administrateur
Commentaire de Afyn le 19/11/2005 14:01:37

Salut ... bravo
Peut être remplacer le tableau par un ArrayList ?
Et utiliser For each ?
Sinon, c'est pas vraiment de l'ODBC pur ... puisque tu utilises ADO (environ 50% plus lent que les API en direct ...)
Bonne suite ...

Afyn - Navedac

signaler à un administrateur
Commentaire de Patrice99 le 19/11/2005 14:59:18

ArrayList : Oui ça serait pas mal, cela éviterait le ReDim Preserve, je n'arrive pas encore à oublier totalement VB6 :-)

ODBC pur via les API : Jamais entendu parler ! tu as un exemple ? cela m'étonnerait que cela soit aussi général (pour Windows) qu'ODBC via ADO.

signaler à un administrateur
Commentaire de BruNews le 19/11/2005 15:55:51 administrateur CS

ODBC CONNEXION MDB ET CREATION TABLE (WIN32)
http://www.cppfrance.com/code.aspx?ID=27746

signaler à un administrateur
Commentaire de Patrice99 le 20/11/2005 09:28:02

BruNews : Ok, il s'agit d'une connexion bas niveau via les API (notamment SQLExecDirect), et l'exemple fonctionne avec Access, mais je ne pense pas que cela puisse fonctionner avec d'autres sources ODBC (peut-être SQL Serveur, mais cela me semble risqué...). Il y a même un bout de code très bas niveau en assembleur ! (heureusement que c'est seulement pour copier une chaîne de caractères, mon exemple en assembleur, c'était pour plaisanter :-)
Par contre ma source fonctionne avec des dizaines de sources ODBC variées, du moment qu'il existe un pilote ODBC pour Windows, toute base de données peut être interrogée ainsi, même des fichiers textes ou csv !

signaler à un administrateur
Commentaire de BruNews le 20/11/2005 11:03:17 administrateur CS

Comme tout le reste, c'est plus long à coder en natif plutot qu'en VB + ADO mais tout se fait. Il faudrait générer la chaine de connexion à l'exécution selon la cible choisie par l'utilisateur, des logiciels commerciaux le font.

signaler à un administrateur
Commentaire de Patrice99 le 16/04/2006 12:07:26

Nouvelle version : on peut maintenant remplir très rapidement un fichier Excel sans ouvrir Excel ! (il faut juste qu'il y ait un entete pour chaque colonne)

signaler à un administrateur
Commentaire de Afyn le 02/01/2007 17:35:14

T'as pas une version VB 2005 espress pour la nouvelle année ?

(Meilleurs voeux)

Afyn - Navedac

signaler à un administrateur
Commentaire de Patrice99 le 03/01/2007 08:53:51

A chaque fois que je poste ou met à jour une source, je teste en VB2005 express pour avoir si possible aucun warning, mais cette année, mes voeux sont de migrer toutes mes applis utilisées professionnellement en DotNet2/VB2005. En tout cas mon prochain développement sera en VB2005 (pour le moment j'évite pour ne pas avoir 2 versions à maintenir, mais c'est vrais que je vais bientôt abandonner VB2003 et VB6, comme ça je pourrais mettre le compilo gratuit sur un portable pour pouvoir faire des corrections sur site).
Pour celle-ci, un ODBCDotNet.sln "Envoyer vers" "Microsoft Visual Basic 2005 Express Edition" fait l'affaire.

signaler à un administrateur
Commentaire de Patrice99 le 25/11/2007 11:19:15

Nouvelle version, en DN2 cette fois :-)

signaler à un administrateur
Commentaire de davidauche le 24/12/2007 11:45:21

ETL en VB! c'est étrange pour moi :-)
Pourrais-tu nous communiquer les résultats des calculs de la complexité (temps/ressources) de ce programme? (par exemple un traitement sur une base de donnée d'un million élément).
Merci d'avance.

signaler à un administrateur
Commentaire de Patrice99 le 25/12/2007 12:29:01

Le fait que cela soit en VB.Net ne change strictement rien (par rapport à C# par exemple). Par contre, le fait de faire des requêtes via ODBC est assez lent, beaucoup plus lent que via des pilotes natifs, c'est sûr, cela ne se discute pas. Par contre, c'est beaucoup plus générique (pas besoin de changer de code selon le PGI du client chez qui tu installes ton logiciel), juste à changer légèrement la syntaxe des requêtes éventuellement. Par exemple un client qui utilise une base distante via TSE avec 5000 articles, il faut 20 minutes pour extraire les stocks et les ventes du mois, assez long donc. Par contre en écriture, c'est très très long, seul un pilote natif peut fonctionner à mon avis. Mais l'idée de faire des outils en VB de pilotage du niveau de stock chez des clients quelque soit leur PGI, c'est plutôt cool, car pas besoin d'être bac+10 pour programmer en VB :-)

signaler à un administrateur
Commentaire de davidauche le 27/12/2007 14:18:18

Merci Patrice! pour ces informations.
Donc VB(plus généralement .NET) n'est pas fait pour ces applications et pour l'ETL surtout! Imagine la base de votre client s'enrichir à 1 million d'article, vous allez lui dire quoi?
Sinon pour orienter un peu les futurs programmeurs des applications d'ETL, faut vraiment oublier le .Net et le VB6. Il y a des autres langages plus compétences pour ce genre des applications : C++, Perl et Java.
Java est plus facile et souplesse mais un peu moins rapide que Perl et C++. En passant en native en Java on peut avoir les mêmes complexités (+/-) que les deux autres.
Thx :-)

signaler à un administrateur
Commentaire de Patrice99 le 29/12/2007 10:53:26

En fait, faire de l'ETL via ODBC, ça passe encore s'il n'y a pas beaucoup d'article, en effet.
S'il y a beaucoup de données, il faudra donc abandonner ODBC et attaquer directement le PGI via des pilotes natifs.
Maintenant, comme on est sur VBFrance, bien sûr que je ne suis pas d'accord avec toi : VB.Net est à mon avis le langage le plus productif qui existe, et à lire la presse informatique, il semblerait que VB.Net finisse par l'emporter sur Java et C#, C++ étant réservé à quelques niches.

signaler à un administrateur
Commentaire de BruNews le 29/12/2007 11:34:43 administrateur CS

Dans la presse, quand c'est écrit blanc on croit noir et vice versa, ça évite toute désillusion ultérieure. La 1ere question à se poser est de savoir pourquoi on l'écrit et qui paie pour le publier.
Sql Server, Office, Visual Studio (2008 !!!), etc, etc. absolument tout est en natif, bizarre que l'éditeur de .net ne pense pas à l'utiliser.
Soyons sérieux, on n'a jamais rien produit en interprété, c'est pas demain la veille que ça changera.

signaler à un administrateur
Commentaire de Patrice99 le 30/12/2007 10:37:10

Brunews : Hum, je crois que j'ai déjà essayé de t'expliquer que l'interprété ce n'est pas tout à fait la même chose que la compilation à la volée : le code pseudo-assembleur est recompilé avant sa première exécution en fonction du processeur utilisé, de sorte que la différence de performance n'est pas si grande que ça : on pourra d'ailleurs toujours améliorer le compilateur à la volée (comme en java).

Pour ce qui est de la presse, mon impression provient des projections d'embauche en fonction des langages les plus demandés (01Informatique en Novembre 2007) : Java : 41%, VB.Net : 31%, C# : 15%

Pour ce qui est des benchmarks, c'est pas évident de trouver des études sérieuses, mais cette page montre qu'il n'y a pas de différence entre C# et C++, et peu entre C++ et C (malheureusement la page d'explication "Scorecard page" n'est plus disponible) :
http://dada.perl.it/shootout/craps.html
http://dada.perl.it/shootout/index.html
Si tu trouves un benchmark plus intéressant je suis preneur.

signaler à un administrateur
Commentaire de BruNews le 30/12/2007 11:55:51 administrateur CS

Les subtilités dans les mots ne changent rien à l'affaire.

On va faire un petit test nous mêmes, la presse et moi...

http://brunews.com/FindIdx.zip
Il y a exe et un txt dans le zip.
Ouvre txt dans notepad, ensuite lance exe.
Les lignes du exe contiennent:
SITE(4 char) + REF(20 char) + ID(8 char) + cadrage(2 char)
total = 36 avec le CRLF

Grace au txt ouvert, tu copies et colles SITE et REF dans la dialog, bouton OK te donne ID associé ou NIET si pas trouvé.
Pour ce faire, prévoir une fonction "int bnFindIdx()" retournant 1 si trouvé sinon 0, si 1 on remplit une chaine des 8 char de ID.
Zone PerfCounter est mesure haute précision obtenue:
QueryPerformanceCounter((LARGE_INTEGER*) &deb);
retour = bnFindIdx();
QueryPerformanceCounter((LARGE_INTEGER*) &fin);
counter pris juste avant l'appel et illico derrière. On affiche fin - deb.

Précision: Interdit d'allouer une string avec tout le fichier, le txt est petit ici pour tests mais dans la réalité il contient la plupart du temps + d'1 million d'enregs. En clair, lecture séquentielle obligatoire à chaque appel de la fonction.
Je suis curieux de savoir ce que donnera la comparaison.

signaler à un administrateur
Commentaire de Patrice99 le 31/12/2007 09:59:24

Tu penses pas sérieusement à faire un vrai benchmark avec un test aussi limité ? Cependant je vais quand même y jeter un oeil pour voir...
Mais pour un vrai benchmark il faut tester pas mal de situations différentes et représentatives.

signaler à un administrateur
Commentaire de BruNews le 31/12/2007 17:54:46 administrateur CS

Autre précision:
Je lis le fichier par passes de 4000 enregs à la fois en mémoire pour rechercher l'item.
Libre à vous de déterminer ce qui est le plus performant avec le framework en taille mémoire mais ne pas dépasser 4000 car en prod j'ai besoin de beaucoup d'autres buffers et ça doit tourner à tout coup.

Patrice, ce simple exemple me semble un bon début de benchmark, il regroupe pas mal de choses employées habituellement. On pourrait fort bien si tu le veux étendre ultérieurement les benchs avec d'autres tests (recherche de mini et maxi sur différents types numériques, etc.) et publier l'ensemble quand on aura une batterie assez étendue.

signaler à un administrateur
Commentaire de Patrice99 le 02/01/2008 09:59:52

Depuis que j'ai converti la source www.leapsecond.com/tools/dbx2txt.c en VB.Net, je pense pouvoir normalement convertir ton exemple : pourquoi est-ce que tu ne me donnes pas ta source en C ou C++ pour que je fasse exactement les mêmes instructions en DotNet ? ça serait assez intéressant je trouve, non ?

Voici comment j'ai converti dbx2txt en DotNet pour info :
http://patrice.dargenton.free.fr/CodesSources/Dbx2Txt.vbproj.html#41

signaler à un administrateur
Commentaire de BruNews le 02/01/2008 19:48:59 administrateur CS

voila
http://brunews.com/FindIdxPROJ.zip

mais bof, il n'y aura là rien de pensé en .NET (classes, gestion exeptions, etc..).

signaler à un administrateur
Commentaire de Patrice99 le 03/01/2008 10:44:37

Effectivement en DotNet bien sûr on ne ferait pas comme ça : on ferait une hashtable avec pour clé une chaîne regroupant l'ensemble des clés requises, c'est à dire ici SITE + REF : ht(Site & Ref) --> ID de la façon suivante en une ligne de code :
If Not ht.ContainsKey(Site & Ref) Then ht.Add(Site & Ref, ID) Else ID = DirectCast(ht(Site & Ref), Long)
C'est impensable de reprogrammer une routine de dichotomie pour rechercher des valeurs !
Je ne comprend pas ta problématique : si tu as besoin de perf alors il faut charger l'index en RAM, tu dis que tu ne peut pas car tu utilises déjà d'autres buffers ? tu as un problème de contrainte particulière qui t'oblige à faire du bas niveau ? ou bien c'est juste par habitude ?
Si t'as vraiment beaucoup de données et que ça loge plus en RAM, alors de toute évidence il faut utiliser un SGBD (et d'ailleurs on peut même remettre le SGBD en RAM, c'est ce que fait Google je crois).
Je ne voie pas en quoi ce test serait représentatif d'un benchmark (d'ailleurs ton idée d'en commencer un est certes louable, mais c'est un job d'une thèse entière, bizarre qu'on ne trouve pas de telle étude facilement d'ailleurs, peut être que ça ferait grincer trop de dents... de même qu'il n'existe pas d'étude comparative des religions :-).

2 choses à ajouter :
Java 9 à 22% et DotNet 54% à 79% : Environnement de développement privilégié par type d'entreprise, tout secteur confondu (public et privé, pour 1850 entreprises interrogées de toutes tailles, d'après une étude Info-Tech Research Group) : source = 01 Informatique n° 1930 du 20 décembre 2007 page 26 (il faut comprendre que le reste des langages = niche).

SQL Serveur 2005 : possibilité de programmer des types : langage : DotNet (même si le moteur lui même n'est pas en DotNet, mais lorsque les hyperviseurs se généraliseront, alors le tout DotNet pourra décoller).

signaler à un administrateur
Commentaire de davidauche le 03/01/2008 13:43:37

Patrice SVP on attend les résultats de .Net! (ça m'intéresse beaucoup). Peu importe la technique utilisée, l'important qu'elle soit optimisée au maxi.

Merci BruNews!

signaler à un administrateur
Commentaire de davidauche le 03/01/2008 13:48:58

PS BruNews : votre lien ne fonctionne pas http://brunews.com/FindIdxPROJ.zip

signaler à un administrateur
Commentaire de Patrice99 le 03/01/2008 14:19:33

J'imagine que cela peut intéresser oui, mais cela représente quand même du boulot, et je préfère éviter de perdre du temps s'il s'agit d'un faux problème. Toutefois, le lien de BruNews est valide, et à priori ce boulot ne devrait pas présenter trop de difficulté, mais yen a pour plusieurs heures tout de même : j'avais prévu d'autres urgences pendant mes quelques jours de vacances (par exemple poursuivre mes migrations DN2).

signaler à un administrateur
Commentaire de davidauche le 03/01/2008 14:39:11

Bah justement, ils disent que VB.Net c'est la facilité, la productivité et la rapidité! tu viens de les contredire :-p

(Je déconne hein! ;-))

signaler à un administrateur
Commentaire de BruNews le 03/01/2008 15:19:39 administrateur CS

J'ai remis le projet vu que ça semble intéresser du monde.

davidauche > la réalité est tétue, la rapididté tant que ça ne doit rien faire.

signaler à un administrateur
Commentaire de davidauche le 03/01/2008 17:40:51

Est-t-il normal que le programme ne marche pas? quand je lance Find avec URL "ULIS" et REF "52144" rien se passe.
Bon! le soir je mate le code un peu :-)

Merci encore BruNews!
PS : C'est un très propre code!

signaler à un administrateur
Commentaire de coq le 03/01/2008 17:45:16 administrateur CS

davidauche => Sur 20 chars la ref, rajoute les espaces derrière.

signaler à un administrateur
Commentaire de Patrice99 le 04/01/2008 09:55:14

Voici ma source, elle est plus rapide et plus stable en performance : 200000 ticks environ

http://patrice.dargenton.free.fr/tmp/TestPerf.zip

Public Class Form1

Private m_ht As New Hashtable

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
    Handles Me.Load

    Dim sCheminIndexes$ = Application.StartupPath & "\Indexes.txt"
    Using fs As New IO.FileStream(sCheminIndexes, IO.FileMode.Open, IO.FileAccess.Read)
    Using sr As New IO.StreamReader(fs)
    Do
        Dim sLigne$ = sr.ReadLine()
        If sLigne Is Nothing Then Exit Do
        Dim sSite$ = sLigne.Substring(0, 4)
        Dim sRef$ = sLigne.Substring(4, 20)
        Dim sCle$ = sSite & sRef
        Dim sId$ = sLigne.Substring(24, 8)
        If Not Me.m_ht.ContainsKey(sCle) Then Me.m_ht.Add(sCle, sId)
    Loop While True
    End Using
    End Using

End Sub

Private Sub cmdChercher_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles cmdChercher.Click

    Dim sSite$ = Me.tbSite.Text
    Dim sRef$ = Me.tbRef.Text
    Dim sCle$ = sSite & sRef
    Me.tbIdx.Text = "(non trouvé)"
    ' http://plasserre.developpez.com/v7-4.htm = Kernel32.QueryPerformanceCounter
    Dim Stopwatch As Diagnostics.Stopwatch = Diagnostics.Stopwatch.StartNew()
    If Me.m_ht.ContainsKey(sCle) Then Me.tbIdx.Text = DirectCast(Me.m_ht(sCle), String)
    Me.tbPerf.Text = Stopwatch.ElapsedTicks.ToString()

End Sub

End Class

signaler à un administrateur
Commentaire de Patrice99 le 04/01/2008 10:02:07

BruNews, si tu penses que j'ai triché, alors explique moi pourquoi toi tu ne peux pas faire pareil (car je n'ai toujours pas compris pourquoi tu ne pouvais allouer plus de mémoire, car en DotNet, cela ne pose pas tant de pb).

signaler à un administrateur
Commentaire de BruNews le 04/01/2008 10:16:02 administrateur CS

En prod ceci est impossible.
La fonction bnFindIdx() est dans un projet important avec plusieurs fichiers énormes à traiter, tous ouverts dans lesquels on pioche l'info nécessaire et selon type d'info et autres params on fait telle manip sur les données.
Il ne faut pas songer un instant à tout mettre en ram, le prog doit tourner à tout coup quelle que soit la taille des fichiers. Le genre de traitement que tu proposes ne doit jamais s'envisager autrement que dans des applets de postes cleints, sur un serveur c'est prohibé.

signaler à un administrateur
Commentaire de BruNews le 04/01/2008 10:18:07 administrateur CS

Pour info, DotNet comme tout autre prog n'a d'autre voie que VirtualAlloc pour la mémoire, il n'y a pas de miracle.

signaler à un administrateur
Commentaire de davidauche le 04/01/2008 11:21:04

Bon bon on va pas comparer comme ça Patrice!

Après petit test vite fait :

- Oui Ton programme est plus performant au niveau rapidité mais au niveau ressources!!!
- Il n'est pas stable du tout! pas de libération des ressources! (Faut forcer ton Garbage collector peut être)
- Ton programme utilise 21 640 Ko
+ Or celui de BruNews utilise uniquement 3 860 Ko

signaler à un administrateur
Commentaire de coq le 04/01/2008 11:44:24 administrateur CS

Mais pourquoi forcer le GC ? Laissez le faire son boulot tranquille !
Si le fait de laisser le GC décider par lui même de la nécessité ou non de devoir passer du temps à libérer de la mémoire vous choque, il faut effectivement laisser tomber .NET/Java et rester en natif.
Et si vous voulez réellement comparer, restez dans les contraintes énoncées par Bruno, ça n'a aucun intérêt sinon.

signaler à un administrateur
Commentaire de Arnotic le 04/01/2008 12:41:34 administrateur CS

En mettant tout le fichier en mémoire j'arrivais à rechercher le bon ID en 21 tick. Alors nettement moins rapide que la version .net qui me donne 1231 tick pour la même chose.

signaler à un administrateur
Commentaire de BruNews le 04/01/2008 14:06:04 administrateur CS

OK j'ai fait la meme version qu'en .NET, fichier full chargé.
Je rappelle que n'ira pas en prod mais on aura au moins une base de benchs:

http://brunews.com/FindIdxFULL.zip

Testé ici sur bixeon et 4 Go ram:
en recherchant ligne 45172
.NET : 216
C : 7
ratio de quasi 31 fois plus lent.

signaler à un administrateur
Commentaire de coq le 04/01/2008 15:01:41 administrateur CS

Le code de Patrice mesure le temps d'execution en incluant la mise à jour du GUI, la différence devrait être moins violente avec un code de ce genre, mais restera sans aucun doute plus lente que le C :

Dim Stopwatch As Diagnostics.Stopwatch = Diagnostics.Stopwatch.StartNew()
Dim idx As String
If Me.m_ht.ContainsKey(sCle) Then
    idx = DirectCast(Me.m_ht(sCle), String)
Else
    idx = "NIET"
End If
Stopwatch.Stop()

Me.tbIdx.Text = idx
Me.tbPerf.Text = Stopwatch.ElapsedTicks.ToString()

signaler à un administrateur
Commentaire de BruNews le 04/01/2008 15:13:11 administrateur CS

SVP, une bonne volonté pour refournir le zip avec maj, je n'ai pas VB d'installé.

signaler à un administrateur
Commentaire de BruNews le 04/01/2008 15:58:57 administrateur CS

MERCI à coq pour:
http://brunews.com/TestPerfDOTNET.zip

le ratio n'est plus que de 2 avec le C, pas mal du tout.

Un comparatif sur la 1ere version serait bien maintenant.

signaler à un administrateur
Commentaire de Patrice99 le 04/01/2008 16:02:39

Effectivement BruNews : ta nouvelle version est passée de 400 000 ticks à moins de 10000 (5000 même parfois), impressionnant !

Effectivement COQ : si je stoppe le timer avant de faire la màj GUI, je retombe aussi à un résultat absolument équivalent.

Conclusion : BruNews est capable de programmer une hashtable à la main apparemment aussi rapide (il faudrait tester d'autres valeurs au hasard, et aussi avec la hashtable). L'avantage de la version de BruNews est qu'elle n'alloue pas les 20 méga en RAM : bien sûr dans la version DotNet, tant qu'on doit interroger la hashtable, on ne peut pas la libérer. Je vais poursuivre qq tests...

signaler à un administrateur
Commentaire de Patrice99 le 04/01/2008 16:06:28

Je viens de mettre à jour mon lien :
http://patrice.dargenton.free.fr/tmp/TestPerf.zip

Dim Stopwatch As Diagnostics.Stopwatch = Diagnostics.Stopwatch.StartNew()
If Me.m_ht.ContainsKey(sCle) Then sId = DirectCast(Me.m_ht(sCle), String)
Dim lTicks& = Stopwatch.ElapsedTicks
Me.tbPerf.Text = lTicks.ToString()
Me.tbIdx.Text = sId

signaler à un administrateur
Commentaire de coq le 04/01/2008 16:14:19 administrateur CS

Oui mais quoiqu'il arrive en situation réelle la hashtable ne sera pas utilisable, tu devrais passer directement aux tests réels.

signaler à un administrateur
Commentaire de Patrice99 le 05/01/2008 09:38:01

Nouvelle version :
http://patrice.dargenton.free.fr/tmp/TestPerf.zip

Notes :
- Le fichier Indexes.txt doit être trié pour la version de BruNews, alors que ce n'est pas nécessaire pour la hashtable ;
- Le code source VB est de niveau débutant alors qu'il est au moins intermédiaire pour la version en C ;
- Hashtable typée = Dictionary : Pas de gain, ni RAM ni perf ! (on évite pourtant un unboxing de Object vers Integer : tester plus de valeurs) ;
- Indexer les sites indépendamment ? (comme la nouvelle version de BruNews) moins de RAM ? tableau de hashtable ? bof ! gains peu probables ;
- RAM allouée : BruNews : 3Mo contre 18,4 Mo pour la version DotNet ;
- Si la taille du fichier Indexes.txt double, alors la RAM allouée via la hashtable doublera aussi (à partir de 10 Mo au minimum) ;
- Reste à faire : moyenne de tests au hasard (car les perf peuvent dépendrent de la position pour la version de BruNews, mais c'est peu probable pour  la version hashtable) ;
- Pour un vrai benchmark, il faudrait programmer le même algo dichotomique en DotNet.

signaler à un administrateur
Commentaire de davidauche le 05/01/2008 16:59:11

J'ai codé les deux versions en java : http://www.megafileupload.com/en/file/34194/FindIdxJava-zip.html

Avec Hashtable :
  - Des temps quasi Null!(pure des cas 16 ticks!) pour java
  - en C : 8 ticks
  - en VB.net : 443 ticks

SANS Hashtable :
  - En VB.net (non disponible pour tester)
  - En Java : 108 ticks (méthode parser ligne par ligne)
  - En C : première exécution 1103 ticks, puis entre 456-600 ticks

=>VB vs Java : c'est déjà le 1/4 sans parler de l'utilisation de Hashtable et la mémoire consommée (en VB.net) (incomparable) :p

=>C vs Java : C'est comparable! :)

signaler à un administrateur
Commentaire de BruNews le 05/01/2008 17:20:04 administrateur CS

Aurais-tu le code java des 2 versions dispo ? m'intéresserait d'y jeter un oeil.
java malheureusement non testable.

signaler à un administrateur
Commentaire de davidauche le 05/01/2008 20:56:01

dsl J'ai oublié de noter qu'il faut mettre le fichier des données dans C:\

signaler à un administrateur
Commentaire de davidauche le 05/01/2008 21:04:40

http://rafb.net/p/Xbxd4T31.html
http://rafb.net/p/I3Vcxz44.html

signaler à un administrateur
Commentaire de BruNews le 06/01/2008 17:17:53 administrateur CS

http://brunews.com/FindIdx.zip

Juste l'exe et le fichier de données.
Nouvelle méthode sur même type d'algo, important benef par rapport au tout début.

C'est version imitant prod, pas de chargement complet du fichier.

signaler à un administrateur
Commentaire de davidauche le 07/01/2008 19:46:17

Chez moi ça passe de :
- 1ère exécution : 6340 (ancienne version) à 4200(la nouvelle)
- 2ème exécution : 3500 (ancienne version) à 2600(la nouvelle)

Je comprends pas pourquoi chaque fois la première exécution est plus lente!

BruNews quelles sont les modifications apportées?

signaler à un administrateur