OVH Cloud OVH Cloud

Dll ou non

16 réponses
Avatar
Patrice Henrio
J'ai besoin d'une fonction déterminant l'intersection de deux segments
(attention pas deux droites).
J'ai réalisé celle-ci dans mon programme.
Je voulais savoir si il y avait un avantage particulier (autre que le
partage du code) à créer une dll contenant cette fonction ou non : rapidité
d'exécution par exemple.
Si je réalise cette fonction en C++, vais-je réellement gagner du temps ?
Cette fonction est utilisée à peu près trente mille fois à chaque cycle du
programme principal.

10 réponses

1 2
Avatar
Patrick Philippot
Patrice Henrio wrote:
J'ai besoin d'une fonction déterminant l'intersection de deux segments
(attention pas deux droites).
J'ai réalisé celle-ci dans mon programme.
Je voulais savoir si il y avait un avantage particulier (autre que le
partage du code) à créer une dll contenant cette fonction ou non :
rapidité d'exécution par exemple.
Si je réalise cette fonction en C++, vais-je réellement gagner du
temps ? Cette fonction est utilisée à peu près trente mille fois à
chaque cycle du programme principal.



Bonjour,

Si je comprends bien, il s'agirait d'écrire une DLL contenant une
implémentation C/C++ de cette fonction actuellement écrite en VB6?

Réponse de normand: vu le nombre de facteurs qui interviennent, il
faudrait tester pour être sûr. Tout dépend du type de calcul que vous
faites. Cependant, il n'est pas évident qu'il y ait un avantage
substantiel à passer en C/C++. Quand VB6 fait des calculs, le rôle de la
runtime est minimum et selon le type d'opérations réalisées, tout cela
se passe de manière plus ou moins proche du processeur.

Plus vous utilisez d'opérations de base directement réalisées par le
processeur, moins la différence sera visible. Plus vous utilisez des
fonctions mises en oeuvre dans une bibliothèque mathématique, plus la
différence dépendra de la qualité de cette bibliothèque.

Par contre, il est évident qu'en C/C++ vous pourrez travailler sur les
optimisations à la compilation, une possibilité exclue en VB6.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Jean-Marc
"Patrice Henrio" a écrit dans le message de
news:%
J'ai besoin d'une fonction déterminant l'intersection de deux segments
(attention pas deux droites).
J'ai réalisé celle-ci dans mon programme.
Je voulais savoir si il y avait un avantage particulier (autre que le
partage du code) à créer une dll contenant cette fonction ou non :


rapidité
d'exécution par exemple.
Si je réalise cette fonction en C++, vais-je réellement gagner du temps ?
Cette fonction est utilisée à peu près trente mille fois à chaque cycle du
programme principal.



Hello,

d'expérience, je suis sur et certain que tu vas effectivement "gagner
du temps", si tu codes ta dll en C, c'est à dire que la fonction
s'exécutera plus vite dans la version C que dans version VB. Pour les
opérations mathématiques, le gain peut être impressionnant (j'ai mesuré
des écarts allant de 1 à 200...).

En C++, ça doit être du mêm ordre, si tu n'utilises pas de trucs trop
exotiques.

Je ne sais pas ce que tu appelles un "cycle" de programme. Mais de
toute façon, pour un nombre d'appels de 30000, la question ne se pose
même pas: tu vas gagner de toute façon.

Enfin dernière question: As tu réellement besoin d'aller vite? Je veux
dire, si les perfs en VB sont déjà OK, alors il ne faut PAS optimiser
avec une dll.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
dark poulpo
"Patrice Henrio" a écrit dans le message de
news:%
J'ai besoin d'une fonction déterminant l'intersection de deux segments
(attention pas deux droites).
J'ai réalisé celle-ci dans mon programme.
Je voulais savoir si il y avait un avantage particulier (autre que le
partage du code) à créer une dll contenant cette fonction ou non :


rapidité
d'exécution par exemple.
Si je réalise cette fonction en C++, vais-je réellement gagner du temps ?
Cette fonction est utilisée à peu près trente mille fois à chaque cycle du
programme principal.



en c++ tu auras effectivement bp plus de rapidité. surtout si c 30000 fois
par cycle.
a condition quie ce soit pas coder a l'arache. je veux dire essaye aussi de
voir si ton algo ne peut pas etre optimisé aussi.
si en plus de cela t connais l'asm, sache quil est possible de rajouter de
l'assembleur dans le vb, jen ai deja fait lexperience.


--
-----
http://dark.freezee.org/
Avatar
dark poulpo
> si en plus de cela t connais l'asm, sache quil est possible de rajouter de
l'assembleur dans le vb, jen ai deja fait lexperience.


jai envoyé avant de finir

c que je veut dire par la, c'est que peut etre tu pourra toi meme inserer :
- soit directement de l'asm dans ton vb (que tu fais toi)
- soit le resultat de ta compilation (moins certaine partie) de ton code en
c++ (pour cela si tu as vc++ demande a generer aussi le code en resultat
dans un fichier, je me souviens plus des noms exacts)

(fo savoir que le code asm dans vb doit etre rentré en hexa decimale, donc
fo pas etre feneant.


--
-----
http://dark.freezee.org/
Avatar
Jean-Marc
"dark poulpo" a écrit dans le message de
news:41e10965$0$19431$
"Patrice Henrio" a écrit dans le message de
news:%
> J'ai besoin d'une fonction déterminant l'intersection de deux segments
> (attention pas deux droites).
> J'ai réalisé celle-ci dans mon programme.



en c++ tu auras effectivement bp plus de rapidité. surtout si c 30000 fois
par cycle.
a condition quie ce soit pas coder a l'arache. je veux dire essaye aussi


de
voir si ton algo ne peut pas etre optimisé aussi.



Hello,

tout à fait d'accord avec ce point. C'est le plus important. Ca ne sert
à rien de coder un algorithme faible dans un langae rapide. Une
réécriture en C ou en Asm n'a un sens que si l'algorithme est le plus
efficient ou le plus adapté pour le problème donné. Cas typique:
reprogrammer en C une recherche linéaire dans un gros tableau non trié
est une idée stupide; Il vaut mieux reprogrammer en VB une recherche en
Hash Table, par exemple, qui sera des milliers de fois plus rapide que
la recherche linéaire en C. Si on n'atteint toujours pas les
performances, alors il peut être temps d'envisager une réécriture en C
de la recherche en Hash Table.

Pour le problème de Patrick, on suppose donc qu'il utilise déà dans sa
version VB le meilleur algorithme de calcul d'intersection de segment.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Patrice Henrio
Je n'en suis pas sûr, je vous joins le code

Public Function InterSegm(ByRef A As POINTAPI, _
ByRef B As POINTAPI, _
ByRef C As POINTAPI, _
ByRef D As POINTAPI) As Single
'Cette fonction recherche l'intersection de deux segments [A,B] et [C,D].
'Elle renvoie 2 s'il n'y pas d'intersection, sinon elle renvoie l'abscisse
barycentrique.
'du point d'intersection dans le repère (A,B)
'Si X est ce point et t l'abscisse barycentrique de X dans le repère (A,B)
alors
' X = (1-t)A + tB
't<0, X est avant A, InterSegm vaut -1
't=0, X=A, InterSegm vaut -1
't<1, X est entre A et B, InterSegm vaut t
't=1, X=B, InterSegm vaut 1
't>1, X est après B, InterSegm vaut -1
'A doit est différent de B, et C est différent de D

If ((A.X = B.X) And (A.Y = B.Y)) Or ((C.X = D.X) And (C.Y) = (D.Y)) Then
InterSegm = -1
Exit Function
End If

Dim alpha As Single, gamma As Single, lambda As Single
alpha = (B.X - A.X) * (D.Y - C.Y) - (B.Y - A.Y) * (D.X - C.X)
gamma = (A.X - D.X) * (D.Y - C.Y) - (A.Y - D.Y) * (D.X - C.X)

'Si alpha est différent de 0, il y a une intersection définie par lambda
If alpha <> 0 Then
lambda = -gamma / alpha
If lambda <= 0 Then lambda = -1
If lambda > 1 Then lambda = -1
InterSegm = lambda
Exit Function
End If

'A partir de ce point, alpha = 0
'Si gamma est différent de zéro, les deux droites, support des segments,
'sont strictement parallèles, il n'y a pas d'intersection
If gamma <> 0 Then
InterSegm = -1
Exit Function
End If

'A partir de ce point, gamma=0
'Les quatre points sont alignés
'On détermine les coordonnées barycentriques de C et de D dans le repère
(A,B)
'C=alpha*A+(alpha-1)*B
'D=gamma*A+(gamma-1)*B
'si alpha ou gamma sont négatifs on les remplace par 2
'lambda est le plus petit des nombres alpha, gamma
'si lambda n'appartient pas à ]0,1], on le remplace par -1
'InterSegm vaut lambda

'Si A.X <> B.X
If A.X <> B.X Then
alpha = (C.X - A.X) / (B.X - A.X)
gamma = (D.X - A.X) / (B.X - A.X)
Else
alpha = (C.Y - A.Y) / (B.Y - A.Y)
gamma = (D.Y - A.Y) / (B.Y - A.Y)
End If
If alpha <= 0 Then alpha = 2
If gamma <= 0 Then gamma = 2
If gamma < alpha Then lambda = gamma Else lambda = alpha
If lambda > 1 Then lambda = -1
InterSegm = lambda
End Function



"Jean-Marc" a écrit dans le message de news:
41e11001$0$2967$
"dark poulpo" a écrit dans le message de
news:41e10965$0$19431$
"Patrice Henrio" a écrit dans le message de
news:%
> J'ai besoin d'une fonction déterminant l'intersection de deux segments
> (attention pas deux droites).
> J'ai réalisé celle-ci dans mon programme.



en c++ tu auras effectivement bp plus de rapidité. surtout si c 30000
fois
par cycle.
a condition quie ce soit pas coder a l'arache. je veux dire essaye aussi


de
voir si ton algo ne peut pas etre optimisé aussi.



Hello,

tout à fait d'accord avec ce point. C'est le plus important. Ca ne sert
à rien de coder un algorithme faible dans un langae rapide. Une
réécriture en C ou en Asm n'a un sens que si l'algorithme est le plus
efficient ou le plus adapté pour le problème donné. Cas typique:
reprogrammer en C une recherche linéaire dans un gros tableau non trié
est une idée stupide; Il vaut mieux reprogrammer en VB une recherche en
Hash Table, par exemple, qui sera des milliers de fois plus rapide que
la recherche linéaire en C. Si on n'atteint toujours pas les
performances, alors il peut être temps d'envisager une réécriture en C
de la recherche en Hash Table.

Pour le problème de Patrick, on suppose donc qu'il utilise déà dans sa
version VB le meilleur algorithme de calcul d'intersection de segment.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."




Avatar
Jean-Marc
"Patrice Henrio" a écrit dans le message de
news:%
Je n'en suis pas sûr, je vous joins le code



// le code

Hello,

je ne suis pas un expert en mathématique, mais je sais qu'il y a plus
efficace (moins d'operations arithmetiques) pour retrouver les
coordonnées du point d'intersection de 2 segments. Cependant, les
fonctions usuelles retournent les coordonnées cartésiennes du point
d'intersection des 2 segments, et non pas comme dans cette fonction
l'abscisse barycentrique. Je ne sais pas si le fait de connaitre cette
abscisse barycentrique est une contrainte liée à la suite des calculs.
Je ne peux donc pas juger de l'efficacité ni de l'utilité de cet algo.

2 choses:

- il existe sur le Net des centaines de pages traitant de
l'intersection de segments. Une recherche avec:
'better algorithm segment intersection' dans Google donne
tout un tas de résultats intéressants. Voir aussi Knuth et les autres.

- le groupe de mathematiques (fr.sci.maths) est plein d'experts!

- tel qu'il est, cet algo me semble tout à fait adapté à un portage en
C (il n'utilise pas de fonctions trigonométriques, etc).

Si les performances n'étaient pas suffisantes, alors il faudrait
envisager d'autres solutions.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
ng
Salut,

d'expérience, je suis sur et certain que tu vas effectivement "gagner
du temps", si tu codes ta dll en C, c'est à dire que la fonction
s'exécutera plus vite dans la version C que dans version VB. Pour les
opérations mathématiques, le gain peut être impressionnant (j'ai mesuré
des écarts allant de 1 à 200...).


pas toujours ca dépend du type de calcul bien.
mais comme toi j'ai eu d'agréable surprise (une fonction qui mettait
plusieurs secondes sous VB et s'executé instantanement en C++ (c'était du
traitement d'image pixel par pixel)) mais par contre pour des boucles et
calculs simple le temps d'execution et rigoureusement le même.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Jean-Marc wrote:
"Patrice Henrio" a écrit dans le message
de news:%
J'ai besoin d'une fonction déterminant l'intersection de deux
segments (attention pas deux droites).
J'ai réalisé celle-ci dans mon programme.
Je voulais savoir si il y avait un avantage particulier (autre que le
partage du code) à créer une dll contenant cette fonction ou non :
rapidité d'exécution par exemple.
Si je réalise cette fonction en C++, vais-je réellement gagner du
temps ? Cette fonction est utilisée à peu près trente mille fois à
chaque cycle du programme principal.



Hello,

d'expérience, je suis sur et certain que tu vas effectivement
"gagner du temps", si tu codes ta dll en C, c'est à dire que
la fonction s'exécutera plus vite dans la version C que dans
version VB. Pour les opérations mathématiques, le gain peut être
impressionnant (j'ai mesuré des écarts allant de 1 à 200...).

En C++, ça doit être du mêm ordre, si tu n'utilises pas de trucs
trop exotiques.

Je ne sais pas ce que tu appelles un "cycle" de programme. Mais
de toute façon, pour un nombre d'appels de 30000, la question ne
se pose même pas: tu vas gagner de toute façon.

Enfin dernière question: As tu réellement besoin d'aller vite? Je
veux dire, si les perfs en VB sont déjà OK, alors il ne faut PAS
optimiser avec une dll.


Avatar
Patrice Henrio
En fait je recherche l'intersection d'un polygone avec un cadre
rectangulaire.
Je ne peux pas utiliser les API rgn car il s'agit de trouver cette
interscetion en ignorant ce qui se passe en dehors du rectangle. On connait
seulemnt les points du polygone qui sont à l'intérieur du rectangle et ceux
d'entrée et de sortie du rectangle.
D'après mes recherches, j'ai vu qu'il me fallait connaitre l'intersection
d'un côté du polygone avec le rectangle ce qui peut donner 0, 1 ou deux
points. De plus, imposer le sens de parcours du polygone, semble simplifier
les calculs, le côté est donc un segment orienté. Dans le cas des deux
points il me faut récupérer le plus près de l'origine du segment.
Je suis loin d'avoir résolu tous les problèmes, en particulier pour un
polygone dont le pourtour est entièrement en dehors du rectangle, comment
différencier les cas ou le rectangle est à l'intérieur du polygone
(grosso-modo un rectangle dans un cercle) de celui où il est à l'extérieur
du polygone (cas limite, un rectangle dans une couronne).
Merci de vous intéresser à mon problème.

Pour ce qui concerne "le cycle du programme", en fait pour la majorité des
évènements concernant ma forme ou l'un de ses composants (clic, déplacement
...) un calcul utilisant la fonction précitée se lance pour chaque point
d'un tableau de 30000 points.


"Jean-Marc" a écrit dans le message de news:
41e11f4c$0$14670$
"Patrice Henrio" a écrit dans le message de
news:%
Je n'en suis pas sûr, je vous joins le code



// le code

Hello,

je ne suis pas un expert en mathématique, mais je sais qu'il y a plus
efficace (moins d'operations arithmetiques) pour retrouver les
coordonnées du point d'intersection de 2 segments. Cependant, les
fonctions usuelles retournent les coordonnées cartésiennes du point
d'intersection des 2 segments, et non pas comme dans cette fonction
l'abscisse barycentrique. Je ne sais pas si le fait de connaitre cette
abscisse barycentrique est une contrainte liée à la suite des calculs.
Je ne peux donc pas juger de l'efficacité ni de l'utilité de cet algo.

2 choses:

- il existe sur le Net des centaines de pages traitant de
l'intersection de segments. Une recherche avec:
'better algorithm segment intersection' dans Google donne
tout un tas de résultats intéressants. Voir aussi Knuth et les autres.

- le groupe de mathematiques (fr.sci.maths) est plein d'experts!

- tel qu'il est, cet algo me semble tout à fait adapté à un portage en
C (il n'utilise pas de fonctions trigonométriques, etc).

Si les performances n'étaient pas suffisantes, alors il faudrait
envisager d'autres solutions.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."




Avatar
Patrice Henrio
Je pense qu'il s'agit de calculs simples comme indiqué dans mon mail un peu
plus bas dans la discussion.

"ng" a écrit dans le message de news:

Salut,

d'expérience, je suis sur et certain que tu vas effectivement "gagner
du temps", si tu codes ta dll en C, c'est à dire que la fonction
s'exécutera plus vite dans la version C que dans version VB. Pour les
opérations mathématiques, le gain peut être impressionnant (j'ai mesuré
des écarts allant de 1 à 200...).


pas toujours ca dépend du type de calcul bien.
mais comme toi j'ai eu d'agréable surprise (une fonction qui mettait
plusieurs secondes sous VB et s'executé instantanement en C++ (c'était du
traitement d'image pixel par pixel)) mais par contre pour des boucles et
calculs simple le temps d'execution et rigoureusement le même.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Jean-Marc wrote:
"Patrice Henrio" a écrit dans le message
de news:%
J'ai besoin d'une fonction déterminant l'intersection de deux
segments (attention pas deux droites).
J'ai réalisé celle-ci dans mon programme.
Je voulais savoir si il y avait un avantage particulier (autre que le
partage du code) à créer une dll contenant cette fonction ou non :
rapidité d'exécution par exemple.
Si je réalise cette fonction en C++, vais-je réellement gagner du
temps ? Cette fonction est utilisée à peu près trente mille fois à
chaque cycle du programme principal.



Hello,

d'expérience, je suis sur et certain que tu vas effectivement
"gagner du temps", si tu codes ta dll en C, c'est à dire que
la fonction s'exécutera plus vite dans la version C que dans
version VB. Pour les opérations mathématiques, le gain peut être
impressionnant (j'ai mesuré des écarts allant de 1 à 200...).

En C++, ça doit être du mêm ordre, si tu n'utilises pas de trucs
trop exotiques.

Je ne sais pas ce que tu appelles un "cycle" de programme. Mais
de toute façon, pour un nombre d'appels de 30000, la question ne
se pose même pas: tu vas gagner de toute façon.

Enfin dernière question: As tu réellement besoin d'aller vite? Je
veux dire, si les perfs en VB sont déjà OK, alors il ne faut PAS
optimiser avec une dll.






1 2