Methode et beauté du code

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Fortix a écrit :Salut, je n'ais pas parcourru de A à Z ce topic mais j'ais compris Grosso Modo de quoi ça parle :lol:

et effectivement il faut créer une Norme de présentation
effectivement , tu aurai mieux fait de lire le topic !!

tu aurai constaté, qu'il ne s'agit pas du tout d'imposer une norme, mais tout simplement de donner des conseils, qui peuvent aider a se retrouver dans un code, même vieux de plusieurs années !!

tu peux continuer a programmer comme bon te semble , il n'est nullement question, de vouloir obliger a quoique ce soit ..(encore heureux !! :) )

la prochaine fois, lit le topic en entier , cela évitera ce genre de réflexion ;) ---->
il est donc prudent de lancer un sondage au préalable, et si il y a "une allimité" (c'est bien écrit :oops: ) mettre au point une forme de présentation dite "universelle"
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Message par Fortix »

:lol: pas la peine de s'énerver :lol:

et puis en plus ce semblant de sujet reste dans le bon sens (à condition de ne pas obliger qui que se soit bien sûr :lol: )

organiser son code (Tabul, espace entre le procedure, zone de commentaire au conditionnel, noms des variables non abstraites, etc...)pour mieux être compris :lol:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Fortix a écrit ::lol: pas la peine de s'énerver :lol:
oui c'est sur ! :)
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Au lieu d'écrire

Code : Tout sélectionner

If Condition1 And Condition2
   ...
EndIf
Il est plus rapide à l'exécution d'écrire

Code : Tout sélectionner

If Condition1
   If Condition2
      ...
   EndIf
EndIf
... Et de placer en Condition1 la plus condition qui sera estimée le plus souvent fausse.
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

Ollivier a écrit :Au lieu d'écrire

Code : Tout sélectionner

If Condition1 And Condition2
   ...
EndIf
Il est plus rapide à l'exécution d'écrire

Code : Tout sélectionner

If Condition1
   If Condition2
      ...
   EndIf
EndIf

ceci me prouve le contraire

Code : Tout sélectionner

a = #False

temp = ElapsedMilliseconds()
For n = 1 To 10000000
  If a And a
  
  EndIf
Next n
Debug ElapsedMilliseconds() - temp


temp = ElapsedMilliseconds()
For n = 1 To 10000000
  If a 
    If a
    
    EndIf
  EndIf
Next n
Debug ElapsedMilliseconds() - temp
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@ChaOs Si, si : j'insiste: 30% de gain ici !

Code : Tout sélectionner

DisableDebugger ; ********************************************************** 1





a = #False


Delay(1) ; ******************************************************************* 2
temp = ElapsedMilliseconds()
For n = 1 To 100000000
  If a And a
 
  EndIf
Next n
Norm = ElapsedMilliseconds() - temp
MessageRequester("Norm1", Str(Norm) )


Delay(1) ; ******************************************************************** 3
temp = ElapsedMilliseconds()
For n = 1 To 100000000
  If a
    If a
   
    EndIf
  EndIf
Next n
Opti = ElapsedMilliseconds() - temp
MessageRequester("Opti1", Str(Opti) ) 






a = #True


Delay(1)
temp = ElapsedMilliseconds()
For n = 1 To 100000000
  If a And a
 
  EndIf
Next n
Norm + (ElapsedMilliseconds() - temp)
MessageRequester("Norm1", Str(Norm) )


Delay(1)
temp = ElapsedMilliseconds()
For n = 1 To 100000000
  If a
    If a
   
    EndIf
  EndIf
Next n
Opti + (ElapsedMilliseconds() - temp)
MessageRequester("Conclusion pour False ET pour True", "Normal = " + Str(Norm) + Chr(10) + "Opti = " + Str(Opti) ) 

Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Dans le prolongement booléen de cette banane, voici un autre code

Code : Tout sélectionner

Macro MyMacro()
...
EndMacro

If Condition1 Or Condition2
   MyMacro()
EndIf
Il est plus rapide à l'exécution d'inverser les deux conditions manuellement et d'écrire ceci à la place:

Code : Tout sélectionner

Macro MyMacro()
...
EndMacro

If (Not Condition1) ; Ici, on inverse ('=' devient '<>', etc...)
   If (Not Condition2) ; Ici, idem
      ; Ligne vide
   Else
      MyMacro()
   EndIf
Else
   MyMacro()
EndIf
Woilà. Il fallait que je la fasse en deux étapes celle-là!

Pourquoi faire simple quand on peut faire compliqué?
>> Parce qu'il faut se méfier des apparences : c'est plus véloce !

Ollivier
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

@Olivier : exacte le debugeur fausse les résultats mais pour avoir des tests vraiment pointue faudrait voir le nombre de cycle utilisé.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Message par PAPIPP »

Bonjour a tous
Je viens de réaliser plusieurs tests sur l'optimisation
statistiquement le if imbriqué est plus rapide que le AND
Par contre le (if not cd1) est toujours plus lent que le If normal
Exemple :

Code : Tout sélectionner

DisableDebugger ; ********************************************************** 1

mes.s=""
maxit=100000000
For i=0 To 5
If i%2
  a=a=#True
  aa.s="oui"
  bb.s="non"
Else
  a = #False
  aa.s="non"
  bb.s="oui"
EndIf
mes=mes+Str(a)+" ****"+Chr(10)

temp = ElapsedMilliseconds()
For n = 1 To maxit
  If a And a
  EndIf
Next n
tp1=ElapsedMilliseconds()-temp
temp = ElapsedMilliseconds()
For n = 1 To maxit
  If a
    If a
      
    EndIf
  EndIf
Next n
tp2=ElapsedMilliseconds()-temp

temp = ElapsedMilliseconds()
For n = 1 To maxit
  If aa="non" And bb="oui"
    
  EndIf
Next n
tp3=ElapsedMilliseconds()-temp


temp = ElapsedMilliseconds()
For n = 1 To maxit
  If aa="non"
    If bb="oui"
      
    EndIf
  EndIf
Next n
tp4=ElapsedMilliseconds()-temp
temp = ElapsedMilliseconds()
For n = 1 To maxit
  If Not (aa<>"non")
    If Not (bb<>"oui")
      
    EndIf
  EndIf
Next n
tp5=ElapsedMilliseconds()-temp

mes=mes+"AND1_"+Str(I)+"= "+Str(tp1)+Chr(10)
mes=mes+"IF1_"+Str(I)+"= "+Str(tp2)+Chr(10)
mes=mes+"AND2_"+Str(I)+"= "+Str(tp3)+Chr(10)
mes=mes+"IF2_"+Str(I)+"= "+Str(tp4)+Chr(10)
mes=mes+"IF2 inv_"+Str(I)+"= "+Str(tp5)+Chr(10)

mes=mes+"****"+Chr(10)
Next i
MessageRequester("AND ou IF ", mes )
A+
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

dans le cas ou il y a beaucoup de test, privilégier le select peut être un plus

Code : Tout sélectionner

DisableDebugger
a = 7

temp = ElapsedMilliseconds()
For n = 1 To 100000000
  Select a
    Case 1
    Case 2
    Case 3
    Case 4
    Case 5
    Case 6
    Case 7
  EndSelect
Next n
temp = ElapsedMilliseconds() - temp
MessageRequester("", Str(temp)) 

temp = ElapsedMilliseconds()
For n = 1 To 100000000
  If a = 1

  ElseIf a = 2
  
  ElseIf a = 3
  
  ElseIf a = 4
  
  ElseIf a = 5
  
  ElseIf a = 6
  
  ElseIf a = 7
  
  EndIf
Next n
temp = ElapsedMilliseconds() - temp
MessageRequester("", Str(temp)) 
KrisJNT
Messages : 110
Inscription : ven. 31/oct./2008 16:51

Message par KrisJNT »

puisque l'on est dans méthode et beauté du code,
je voudrais savoir :

est-il possible décrire une ligne de code sur plusieurs ligne ? L'idéal serait (pour moi) des lignes comme ceci :

Code : Tout sélectionner

OpenWindow(#window, _
10, 10, _
640, 480, _
"Titre de ma fenêtre", _
#WS_VISIBLE)
Cette écriture qui permet de poursuivre une ligne de code sur une autre est celle de Liberty Basic, le langage de programmation que j'utilisais avant PB. Justement, je trouve PB très bien, mais comm syntaxe, les commandes sont un peu longue et ça donne un impression de surcharge, je trouve...

Bref, s'il y a un moyen, comment peut-on faire ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

non pas possible actuellement , peut etre la prochaine version :)
jerexgrz
Messages : 279
Inscription : dim. 05/juin/2005 20:27

Message par jerexgrz »

select case ... est plus rapide que if ... elseif ... ?

bizarre j'ai le contraire (debuggeur desactivé):
859 le 1er
813 le 2nd (if ...)
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message par Geo Trouvpatou »

Salut.

Bon je voulais tester quelques trucs au niveau rapidité d'execution.
Donc je viens ici pour récupérer un code pour un benchmark, mais je me demande si cela sert à quelque chose.
Vous dites que tel ou tel truc est plus rapide que tel autre truc.
Moi je veux bien mais dans le code ci-dessous quel est le plus rapide pour les un et les autres :wink:

Code : Tout sélectionner

DisableDebugger ; ********************************************************** 1 

Delay(1) ; ******************************************************************* 2 
temp = ElapsedMilliseconds() 
For n = 1 To 100000000 
    
    trucATester + 1
    
Next n 
Norm = ElapsedMilliseconds() - temp 
MessageRequester("Norm1", Str(Norm) + " - " + Str(trucATester))  


Delay(1) ; ******************************************************************** 3 
temp = ElapsedMilliseconds() 
For n = 1 To 100000000 
    
    trucATester + 1
    
Next n 
Opti = ElapsedMilliseconds() - temp 
MessageRequester("Opti1", Str(Opti) + " - " + Str(trucATester)) 
Bref pas très fiable ce bench :cry:
Sauf si les différences d'exécution se comptent en secondes (ou en heures :lol:)

Bye.
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

peut etre que avec ceci les test seront plus précis

Code : Tout sélectionner

Procedure.q ElapsedCycles()
  !rdtsc 
  ProcedureReturn 
EndProcedure
Répondre