OVH Cloud OVH Cloud

Objet performance drawing.image.

4 réponses
Avatar
pradon
bonjour =E0 tous!


Je n'arrive pas =E0 croire que VB.net soit moins performant=20
que vb6 quand il s'agit de traiter des bitmaps.

Quelqu'un peut il charger une grosse bitmap (30 mo au=20
moins) sous VB6 ,puis sous VbNet et me donner les temps=20
respectifs de chargement .

Les codes vb6 et vbnet pouvant =EAtre utilis=E9s sont les=20
suivants :

Code ultra simplifi=E9 en VB 6:=20
Private Sub Command1_Click()
Image1.Picture =3D LoadPicture("c:\temp\votreimage.bmp")
End Sub

Le m=EAme code en VB Net
Private Sub Command1_Click(ByVal eventSender As=20
System.Object, ByVal eventArgs As System.EventArgs)=20
Handles Command1.Click =20
Image1.Image =3D System.Drawing.Image.FromFile
("c:\temp\votreimage.bmp") =20
End Sub

Merci!..j'esp=E8re des r=E9sultats positifs! apr=E8s tous ces=20
efforts, je ne me vois pas retourner au VB6!..qui n'est=20
m=EAme plus commercialis=E9!

4 réponses

Avatar
Zoury
Salut Pradon!

J'ai fait quelques tests sur un bitmap 24bits (6400x3600) fesant 65,9 Mo sur
le disque.
J'obtiens des résultats tournant autour de 190 ticks en .NET (en Debug et en
Release) et d'environ 405 ticks pour VB6 sur Windows XP Pro Sp1 (Pentium 4,
2.8Ghz, 1Go RAM).

Note que si j'enlève le bmp.Dispose(), le temps de chargement double à
chaque deux tests environ.

VB6
'***
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Command1_Click()

Dim pic As StdPicture
Dim n As Long

n = GetTickCount
Set pic = LoadPicture("c:image.bmp")
Debug.Print GetTickCount - n

End Sub
'***

VB.NET
'***
Private Declare Function GetTickCount Lib "kernel32" () As Int32

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim n As Int32 = GetTickCount()
Dim bmp As Bitmap = DirectCast(Image.FromFile("C:image.bmp"), Bitmap)
Console.WriteLine(GetTickCount() - n)
bmp.Dispose()
End Sub
'***

Je ne sais vraiment pas pourquoi la différence entre les méthodes prend est
aussi grande chez toi.. peut-être ton ordi est-il occupé à autres choses
durant le chargement ou encore ta mémoire vive est surchargée ?

--
Cordialement
Yanick
MVP pour Visual Basic
"pradon" a écrit dans le message de
news:182a01c4fcb3$86bf8360$
bonjour à tous!


Je n'arrive pas à croire que VB.net soit moins performant
que vb6 quand il s'agit de traiter des bitmaps.

Quelqu'un peut il charger une grosse bitmap (30 mo au
moins) sous VB6 ,puis sous VbNet et me donner les temps
respectifs de chargement .

Les codes vb6 et vbnet pouvant être utilisés sont les
suivants :

Code ultra simplifié en VB 6:
Private Sub Command1_Click()
Image1.Picture = LoadPicture("c:tempvotreimage.bmp")
End Sub

Le même code en VB Net
Private Sub Command1_Click(ByVal eventSender As
System.Object, ByVal eventArgs As System.EventArgs)
Handles Command1.Click
Image1.Image = System.Drawing.Image.FromFile
("c:tempvotreimage.bmp")
End Sub

Merci!..j'espère des résultats positifs! après tous ces
efforts, je ne me vois pas retourner au VB6!..qui n'est
même plus commercialisé!
Avatar
Patrice Ongla
> VB6
'***
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Command1_Click()

Dim pic As StdPicture
Dim n As Long

n = GetTickCount
Set pic = LoadPicture("c:image.bmp")
Debug.Print GetTickCount - n

End Sub
'***

VB.NET
'***
Private Declare Function GetTickCount Lib "kernel32" () As Int32

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim n As Int32 = GetTickCount()
Dim bmp As Bitmap = DirectCast(Image.FromFile("C:image.bmp"), Bitmap)
Console.WriteLine(GetTickCount() - n)
bmp.Dispose()
End Sub
'***



C'est fou comme vb.net parait verbeux vu comme ça... :)
(VB6 : 7 lignes, 133 carcatères / VB.Net : 8 l, 296 c)

Allez, rassurez-vous, je regrette pas :)
Avatar
Zoury
> C'est fou comme vb.net parait verbeux vu comme ça... :)
(VB6 : 7 lignes, 133 carcatères / VB.Net : 8 l, 296 c)



haha! je n'y avais jamais porté attention. :O)

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Pradon
>-----Message d'origine-----
C'est fou comme vb.net parait verbeux vu comme ça... :)
(VB6 : 7 lignes, 133 carcatères / VB.Net : 8 l, 296 c)



haha! je n'y avais jamais porté attention. :O)

--
Cordialement
Yanick
MVP pour Visual Basic






à yanick !


merci.

Ton code me montre que le chargement de l'image est
effectivement très rapide (même chez moi)et que le
problème se situe donc à l' affichage :j'ai rajouté le
code suivant( après avoir créé une picture image1 sur une
form1) :
n = GetTickCount()
Image1.Image = DirectCast(bmp, Bitmap)
MsgBox("temps d 'affichage=" & Str(GetTickCount() -
n)),

et j'ai retrouvé la galère : 50 secondes environ pour
afficher.

J'ai le moral à moitié remonté !
le problème est précisé, mais il est toujours là .
Reformulons le :
Combien de temps faut il pour afficher une image(déjà
chargée)de 60 mo à l écran ?
Il me faut toujours prés d'une minute en vbnet!
....après nouveau test le mystère s'épaissie.
-sous VB6
le code suivant :
Private Sub Command1_Click()
Dim pic As Picture
Dim n As Long
n = GetTickCount
Set pic = LoadPicture("c:tempzd.bmp")
'chargement en mémoire
MsgBox GetTickCount - n
n = GetTickCount
'affichage à lécran
Image1.Picture = pic
MsgBox GetTickCount - n

End Sub

Donne :
Temps de chargement-> 22109 (22s)
Temps d'affichage ->610 (0.6s)

Sous VB net le code équivalent(1) donne
Temps de chargement-> 4953 (22s)
Temps d'affichage -> 78 (0.076 s)

Ce serait merveilleux si le temps d'affichage réél
n 'était pas de 50 s environ sur ma machine et,ce qui est
plus inquiétant sur les machines cibles !

Peu tu tester ces lignes sur ta machine ?

Merci
(et merci par avance , de me consacrer encore un peu de
temps !)

C'est vrai que c'est verbeux, moi j'aurai bien vu
l'utilisation de couleurs différentes une pour le code
ajouté par le compilateur ,une pour pour les déclarations
de variables et toutes les floritures
incontournables,enfin une autre pour "le vrai code" celui
qui parle quand on le lit,avec possibilité de masquer les
2 premières couleurs.

(1) Private Declare Function GetTickCount
Lib "kernel32" () As Integer
Private Sub Command1_Click(ByVal eventSender As
System.Object, ByVal eventArgs As System.EventArgs)
Handles Command1.Click


Dim pic As System.Drawing.Image
Dim n As Integer

n = GetTickCount
pic = System.Drawing.Image.FromFile
("c:tempzd.bmp")
MsgBox(GetTickCount - n)
n = GetTickCount
Image1.Image = pic
MsgBox(GetTickCount - n)

End



.