Forum Liberty Basic France

Général » Scientifique, ou littéraire ? de l'influence de la longueur des noms de variables
Le 22/02/2016 à 13h38

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Hello tous !

Un essai en marge du projet de générateur (qui m'a permis de constater que la valeur 0 d'un échantillon wav occupe en fait le caractère 128, et non 127 comme je l'ai souvent lu dans les docs que j'ai pu compulser jusqu'à aujourd'hui, ou encore il y a un truc que j'ai pas capté, mais ce n'est pas la discussion pour...)

JB permet de nommer des variables en utilisant des noms explicites. Mais la longueur des noms de variables a-t-elle une influence sur la vitesse d'exécution du programme ?

Attention aux interprétations hative : je n'ai aucune idée de ce qui peut être fait pour optimiser le code, et l'instruction print consomme du temps aussi.

J'ai laissé oméga tranquille, j'aurais pu le remplacer par "w" ou le caractère oméga (il me semble bien qu'il existe en code-à-ski)

Demandez le programme :
Code VB :
 
'essais calculs d'échantillonnage

'approche "littéraire"

instantdebutlitteraire=time$("ms")
 
    'valeurs
    pi=3.1415926536
    frequence1=1500
    volume1=100
    frequence2=1200
    volume2=100
    frequencechantillonnage=44100
 
    'calculs préparatoires
    omega1=2*pi*frequence1
    omega2=2*pi*frequence2
    periodechantillonnage=1/frequencechantillonnage
    amplitudemaxi=400
    valeurmaxechantillon=256
 
    'on recherche expérimentalement la période permettant de définir complètement la somme
    trouve=0
    instantt=0
    tour=0
    limitetemps=3000*periodechantillonnage
    tempsdepasse=1
 
    while trouve=0
 
        anciengenerateur1=generateur1
        anciengenerateur2=generateur2
 
        generateur1=volume1*sin(omega1*instantt)
        generateur2=volume2*sin(omega2*instantt)
 
        print generateur1;"       ";generateur2
 
        'détecte le passage par zéro en montant
        if anciengenerateur1<0 and generateur1>=0 then generateur1zeromontant=1:print "generateur1 passe 0 en montant"
        if anciengenerateur2<0 and generateur2>=0 then generateur2zeromontant=1:print "generateur2 passe 0 en montant"
 
        if generateur1zeromontant=1 and generateur2zeromontant=1 then trouve=1:print "*** trouvé au ";tour;"ème calcul ! ***"
 
        generateur1zeromontant=0
        generateur2zeromontant=0
 
        tour=tour+1
        instantt=instantt+periodechantillonnage
        if instantt>limitetemps then trouve=1:tempsdepasse=1:print "!!! pas trouvé !!!"
 
    wend
 
    print
    print "**** calcul des octets à stocker dans le fichier ****"
 
    instantt=0
    valeurmaxoctet=0:valeurminoctet=256 '(c'est inversé, c'est normal ici)

    for a=1 to tour
        somme=volume1*sin(omega1*instantt)+volume2*sin(omega2*instantt)
        echantillon=int(128+somme*valeurmaxechantillon/amplitudemaxi)
 
        if valeurmaxoctet<echantillon then valeurmaxoctet=echantillon
        if valeurminoctet>echantillon then valeurminoctet=echantillon
        print "somme = ";somme;", échantillon = ";echantillon
 
        instantt=instantt+periodechantillonnage
    next
 
    print:print
    print "valeurs maxi et mini de l'échantillon : ";valeurmaxoctet;"   ";valeurminoctet
    print "amplitude : ";valeurmaxoctet-valeurminoctet
 
instantfinlitteraire=time$("ms")
 
 
'approche scientifique
    t0=time$("ms")
 
    'valeurs
    pi=3.1415926536
    f1=1500
    v1=100
    f2=1200
    v2=100
    fe=44100
 
    'calculs préparatoires
    omega1=2*pi*f1
    omega2=2*pi*f2
    te=1/fe
    amax=400
    maxech=256
 
    'on recherche expérimentalement la période permettant de définir complètement la somme
    trouve=0
    t=0
    tr=0
    ltps=3000*te
    tpsdep=1
 
    while trouve=0
 
        ag1=g1
        ag2=g2
 
        g1=v1*sin(omega1*t)
        g2=v2*sin(omega2*t)
 
        print g1;"       ";g2
 
        'détecte le passage par zéro en montant
        if ag1<0 and g1>=0 then g1zm=1:print "generateur1 passe 0 en montant"
        if ag2<0 and g2>=0 then g2zm=1:print "generateur2 passe 0 en montant"
 
        if g1zm=1 and g2zm=1 then trouve=1:print "*** trouvé au ";tour;"ème calcul ! ***"
 
        g1zm=0
        g2zm=0
 
        tr=tr+1
        t=t+te
        if t>ltps then trouve=1:tpsdep=1:print "!!! pas trouvé !!!"
 
    wend
 
    print
    print "**** calcul des octets à stocker dans le fichier ****"
 
    t=0
    maxoct=0:minoct=256 '(c'est inversé, c'est normal ici)

    for a=1 to tr
        som=v1*sin(omega1*t)+v2*sin(omega2*t)
        ech=int(128+som*maxech/amax)
 
        if maxoct<ech then maxoct=ech
        if minoct>ech then minoct=ech
        print "somme = ";som;", échantillon = ";ech
 
        t=t+te
    next
 
    print:print
    print "valeurs maxi et mini de l'échantillon : ";maxoct;"   ";minoct
    print "amplitude : ";maxoct-minoct
 
t1=time$("ms")
 
 
'résultats
print
print
print"durée du traitement, littéraire : ";instantfinlitteraire-instantdebutlitteraire;" ms"
print"durée du traitement, scientifiq : ";t1-t0;" ms"
 
end
 




Edité par Christophe Le 22/02/2016 à 13h45
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 24/02/2016 à 17h37

Administrateur

Groupe: Administrateur

Inscrit le: 25/09/2010
Messages: 361
Salut Christophe,

Dans un langage compilé, les noms des variables sont convertis en adresses mémoire dans l'exécutable et donc n'influent en rien la vitesse d’exécution du programme.
Pour un langage semi-compilé tel que le Java ou le JustBasic, ils sont transformé en référence , cad, en noms incompréhensible par nous autre humain. Ces références doivent être toutes d'environ la même longueur, quelque soit le nom originel de la variable. Donc la vitesse d’exécution n'est pas influencée non plus.
Finalement, pour un langage interprété comme le Python ou le PHP, la ligne qui est exécutée doit être lue, donc le nom de la variable également. Donc là oui, il pourrait y avoir une influence, mais vraiment négligeable, ce n'est pas une optimisation faite couramment, cela n'en vaut pas la peine est rend le code moins lisible.

Pour les optimisations, en effet, le print est à bannir dans les boucles ect., les accès aux fichiers peut prendre du temps aussi. Après, JB ne nous laisse pas une grande marge de se coté là, c'est surtout l'algo qu'il faut optimiser ;)

Cordialement,
Jagang
____________________
J'ai toujours raison ! Sauf quand j'ai tort ...

Web    
Le 25/02/2016 à 15h40

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Merci pour ces précisions, jagang, j'y penserai pour mon prochain code.

J'ai lancé plusieurs fois la compilation par le bouton "run", et globalement il y avait presque toujours quelques dizaines de millisecondes en plus pour la version littéraire : là c'est normal puisque ce n'est pas l'exécutable qu'on lance. Par contre, la différence était variable d'un essai à l'autre, j'ai même eu droit une fois à la version "littéraire" plus rapide que la version "scientifique", il ne suffit donc pas de parsemer son code de time$ pour mesurer à coup sûr la durée d'un processus, il faut sans doutes savoir ce que fait l'ordinateur en même temps...

Mince, c'est pas si évident que ça... (c'était par curiosité, je n'ai pas besoin de mesurer précisément un temps d’exécution).
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Général » Scientifique, ou littéraire ? de l'influence de la longueur des noms de variables  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie