Aller au contenu
mprinfo

Lua - Programmation La Régle De 3 By Steven

Recommended Posts

Il y a 3 types d'optimisation.

 

  • la mémoire,
  • le temps processeur
  • le temps du développeur.

 

 
Une bonne application prend en compte ces 3 critères en essayant de faire un bon compromis entre les 3.
 
Voici donc une petite analyse sur votre code ... attention, je suis volontairement très très critique juste pour essayer d'aider. Perso, la plus part de mon code n'est pas optimiser ainsi, voir pas du tout :)
.
.

  • Optimisation mémoire :20:

 
Chaque variable déclarée pend une infime place en mémoire (son adresse) donc si on a pas besoin de la réutiliser ou de la maintenir ... on en fait pas :)

Une variable utilisée qu'une seule fois ne sert donc à  rien : exemple 

local message = string.format("La box a démarré le %s a %s", os.date("%d/%m/%Y"), os.date("%R"))
EnvoiPush(message)

On fait directement : 

    EnvoiPush(string.format("La box a démarré le %s a %s", os.date("%d/%m/%Y"), os.date("%R")))

.
.

  • Optimisation temps processeur  :5: 

 
La démarche a déjà  été faite .. bravo.

 

En effet, certaine opération prenne du temps a être exécutée, il faut donc éviter de demander 2 fois le même calcul pour rien. Exemple :

    if ( os.date("%H:%M", os.time())== lever ) or ( os.date("%H:%M", os.time()) == coucher ) then

On voit bien qu'on demande au processeur de calculer 2 fois l'heure actuelle alors que ce qui a été fait 

    local osHeure = os.date("%H:%M", os.time())
    if ( osHeure == lever ) or ( osHeure == coucher ) then

est bien moins coà»teux puisque nous divisons simplement pas 2 le temps processeur.

Bon ok, on passe de 0.00002 sec à  0.00001 sec :) Mais c'est un exemple.
 
 

  • Optimisation développeur :6:

 
Moins il y a de code a maintenir mieux c'est.
 
Donc vu que ceci :

    if (heure >= lever) and (heure < coucher) then
        valeur = "Jour"
    end

revient au même que ceci (dans ce contexte)

    if ( OsHeure == Lever ) then
       Valeur = "Jour"
    else
       Valeur = "Nuit"
    end

On extrait tout cela et on en fait une méthode (function) :

function traitement(lever, coucher, heure)
        local valeur = "Nuit"
        -- test si on est le jour ou la nuit
        if (heure >= lever) and (heure < coucher) then
           valeur = "Jour"
        end
        ...
end

.
.

  • Optimisation bonus ... optimisation pour l'utilisateur

 
On remonte tout en début du code, les variables, traitements que l'utilisateurs doit modifier afin que ce dernier n'aie pas a chercher dans le code la ligne X ou Y.

Donc on met ce ci tout en haut : 

local NomVG = "Jour_Nuit"
local IdTel = 181

On obtient donc ceci :

--[[
%% autostart
--]]
 
local NomVG = "Jour_Nuit"
local IdTel = 181
 
----------------------------------------------------------------------
-- Envoi d'un Push pour avertir que le box à  démarrer ou redémarrer --
----------------------------------------------------------------------
function EnvoiPush(Message)
        fibaro:debug(Message)
        fibaro:call(IdTel, "sendPush", Message)
end
 
---------------------------------------------------
-- Mise a jour d'une variable global             --
---------------------------------------------------
function UpdateVG(Valeur)
        if (fibaro:getGlobalValue(NomVG) == nil) then
           fibaro:debug("il faut cree la variable "..NomVG)
           EnvoiPush(string.format("La variable Globale %s n'existe pas ou a ete supprimer", NomVG))
           fibaro:abort() -- fin du programme
        else
           fibaro:debug("VariableGlobale = "..NomVG.." - Valeur = "..Valeur)
           fibaro:setGlobal(NomVG, Valeur);
        end
end
 
---------------------------------------------------
-- Vérification de l'heure et mise à  jour        --
-- de la variable si necessaire                  -- 
---------------------------------------------------
function traitement(lever, coucher, heure)
	local valeur = "Nuit"
	-- test si on est le jour ou la nuit
	if (heure >= lever) and (heure < coucher) then
		valeur = "Jour"
	end
	UpdateVG(nuit) -- mise a jour de la VG Jour_Nuit
end
 
-- =======================================
-- Début du code
-- =======================================
----------------------------------------------------------------------
-- Controle si 1 Scéne et déjà  en cours                             --
----------------------------------------------------------------------
local NbreScene = fibaro:countScenes()
fibaro:debug("Nombre de scéne : "..NbreScene)
if (NbreScene ~= 1) then; fibaro:abort(); end
 
----------------------------------------------------------------------
-- Mise a jour de la variable VG Jour_Nuit au Démarrage de la Box   --
-- Ou lors de la sauvegarde de la scéne                             --
----------------------------------------------------------------------
EnvoiPush(string.format("La box a démarré le %s a %s", os.date("%d/%m/%Y"), os.date("%R")))
traitement(fibaro:getValue(1, "sunriseHour"), fibaro:getValue(1, "sunsetHour"), os.date("%H:%M"))
 
----------------------------------------------------------------------
-- Test toute les minutes pour savoir si c'est jour ou nuit         --
----------------------------------------------------------------------
while true do
	local osHeure = os.date("%H:%M", os.time())
	local lever = fibaro:getValue(1, "sunriseHour")
	local coucher = fibaro:getValue(1, "sunsetHour")
 
	if ( osHeure == lever ) or ( osHeure == coucher ) then
		traitement(lever, coucher, osHeure)
	end
	fibaro:debug(string.format("Lever Soleil : %s - Coucher Soleil : %s", lever, coucher))
	fibaro:sleep(60*1000);
end

 

Maintenant, vous pouvez oublier tout ces bons préceptes car quand on regarde le code des professionnels, on voit bien que la théorie fait bien souvent place à  la fatigue cérébrale et que 90% du code ne respecte pas le moindre petit de ces préceptes.

 

 

Garbage collector

 

Un gabagge collector n'est-il pas le truc inventé pour palier au mauvais développement ? ... Je plaisante ;) . Il y en a un, mais comme toujours, moins la mémoire est sollicitée, moins le garbage collector fonctionne, meilleures sont les performances. Il ne faut pas oublier que lorsque le garbage collector fait son nettoyage, il prend énormément de ressources.

 

Je travaille sur Java, et c'est horrible de voir que plus on améliore le garbage collector, plus les développeurs ne font pas attention. C'est le serpent qui se mord la queue.

 

"Un garbage collector est coà»teux en performance, bien que dans la plus part des cas, son utilisation permet d'augmenter les performances globales d'une application" ... et si, un jour, on se mettait autour d'une table et qu'on se disait :

 

- Il y a 25 ans, on faisait attention au nombre de ligne de code

- Il y a 20 ans, on faisait attention à  l'utilisation de la mémoire

- Il y  a 10 ans, on faisait attention à  la place disque

- Aujourd'hui, on se fout de tout alors on a inventé la "défragmentation" 

 

 

Pour les curieux : 

Ramasse-miettes (Garbage Collector)

.

.

.

 

Librairies

 

Oui LUA permet les librairies, mais pas sur la Fibaro ou cette possibilité est désactivée.

Le mot clé, de mémoire est : require

.

 

:13: Merci Steven pour ces explications. :13:

 

 

Lien utiles pour la programmation lua :

 

lua.org (Site Officiel Lua Anglais)

WX LUA.fr

Developer fibaro/ (Anglais)

Programmation LUA Structures de Base

LUA pour les débutants

Introduction à  la Programmation LUA

Les bases de la programmation avec lua

  • Thanks 1
  • Upvote 3

Partager ce message


Lien à poster
Partager sur d’autres sites

En grande forme le Lorrain !

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Normal je suis en congé lol

Envoyé avec mon SmartPhone

Partager ce message


Lien à poster
Partager sur d’autres sites

mprinfo en mode tuto ;-)

 

super !!

Partager ce message


Lien à poster
Partager sur d’autres sites

mprinfo ne serait-il pas prof ? :) 

 

Petite question j'ai pas encore ma HC2, donc je ne suis pas encore au point sur le LUA. Mais est-ce qu'un garbage collector est présent ? Si oui, le premier point sur la mémoire n'a pas un gros impact, si l'objet n'est plus utilisé la mémoire est en théorie libérée.

 

Pour le reste c'est assez propre, il semblerait que le LUA soit un langage fonctionnel, est-il possible de faire des librairies pour réutiliser certaines fonctions ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Garbage collector

 

Un gabagge collector n'est-il pas le truc inventé pour palier au mauvais développement ? ... Je plaisante ;) . Il y en a un, mais comme toujours, moins la mémoire est sollicitée, moins le garbage collector fonctionne, meilleures sont les performances. Il ne faut pas oublier que lorsque le garbage collector fait son nettoyage, il prend énormément de ressources.

 

Je travaille sur Java, et c'est horrible de voir que plus on améliore le garbage collector, plus les développeurs ne font pas attention. C'est le serpent qui se mord la queue.

 

"Un garbage collector est coà»teux en performance, bien que dans la plus part des cas, son utilisation permet d'augmenter les performances globales d'une application" ... et si, un jour, on se mettait autour d'une table et qu'on se disait :

 

- Il y a 25 ans, on faisait attention au nombre de ligne de code

- Il y a 20 ans, on faisait attention à  l'utilisation de la mémoire

- Il y  a 10 ans, on faisait attention à  la place disque

- Aujourd'hui, on se fout de tout alors on a inventé la "défragmentation" 

 

 

Pour les curieux : 

Ramasse-miettes (Garbage Collector)

.

.

.

 

Librairies

 

Oui LUA permet les librairies, mais pas sur la Fibaro ou cette possibilité est désactivée.

Le mot clé, de mémoire est : require

.

.

.

 

P.S. Jamais je n'ai pensé que mon post ce retrouverais en tant que tuto  :) La prochaine fois, je mettrais des exemples plus parlant et j'étofferais plus mes dires  ;)

.

.

 

P.S.2 Pour mprinfo, un gabage collector est le Alzeihmer d'un programme, le truc qui fait que ta mémoire se vite (à  ton age .. trop vite :P )

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

haaaann  c'est pas bien de se moquer steven ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

Steven, je suis bien d'accord avec toi concernant le garbage collector mais dans ce cas là , n'y a t il pas une fonction qui permet de libérer la variable?

 

On parle d'ailleurs ensuite d'optimisation du temps développeur, je trouve très difficile à  lire du code regroupé sur une seule ligne suivant les cas surtout qu'on peut vite se retrouver dans le cas 2 à  faire l'opération plusieurs fois.

 

Sinon tu codais déjà  il y a 25 ans ? :D Attention à  ton garbage collector aussi !

Partager ce message


Lien à poster
Partager sur d’autres sites

Je me demande si l'avatar de mprinfo n'a pas une certaine influence, pour ne pas dire une influence certaine, sur la colorisation de ses posts !!! :D (En attendant, ça me manque depuis que j'ai quitté la région !!!!)

 

@Steven : Dans une autre vie j'ai été project manager et je passais mon temps à  me battre avec les développeurs qui disaient : La mémoire on s'en fout ça coute plus rien !

  • Upvote 3

Partager ce message


Lien à poster
Partager sur d’autres sites

@steven je préfére avoir Parkinson qu' Alzeihmer. Il vaut mieux renverser un peu le contenu de son verre plutôt que d'oublier de le boire :2:

 

Personnellement je n'ai que 64ko de mémoire comme mon très chers commodore 64 et ça me suffit largement

 

Si je ne me trompe pas l'informatique fonctionne toujours avec des 0 ou des 1

 

On ne fait que rajouter des couches et des couches depuis des années 1 cÅ“ur, 2 cÅ“ur, 4 cÅ“ur etc.. moi j'en ai qu'un et il est malade :D 

 

Pour exemple le Lua a bien été écrit en C si je ne me trompe pas et le C en Hexa

 

Quand je vois la taille d'un script pour écrire un texte sur l'écran ça me fait doucement rire et oui il faudrait connaitre l'adressage de l’écran savoir ou mettre le texte etc.. pas simple pour Monsieur tous le monde

 

Je pense même que pour la V5 il va falloir ajouter de la RAM et overclocker ou changer le CPU  :2: 

Partager ce message


Lien à poster
Partager sur d’autres sites

@Pépite tu as des soucis avec GEA pour fayoter avec Steven :D

 

@Steven désolé pour ce tuto. J'ai pas demander car c'est pas du code.  je pensé que quelqu'un allait le faire, j'ai attendu quelques jours pour voir et rien. A priori on préfère lire les tutos plutôt que de les faire ;)

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

mprinfo = 1 CPU downclocker, 64Ko RAM, 0 ou 1 bitte .. j'ai pas bien compris la fin :)

 

@mprinfo : 

Tout les temps que tu consacres à  faire des tutos est du temps gagné pour les autres. Donc merci pour nous tous. 

 

 

@D-GK

Attention, optimiser le temps du développeur ne veux pas dire minimiser le nombre de ligne à  son paroxysme. Cela signifie surtout "centraliser" et "réutiliser" le code existant (en gros, éviter les doublons et les copier/coller en créant des méthodes (function)). Cela signifie aussi d'essayer de respecter les conventions de nommages et les habitudes des autres développeurs (afin de permettre une reprise plus aisée de son code).

 

J'ai déjà  analyser le code de certains collègues ou on trouve des méthodes "getMontantFacturation" qui retourne ... la date de la prochaine facturation ... cherchez l'erreur et surtout la perte de temps quand on cherche un bug.

 

Mais je suis 100% d'accord avec toi, parfois la lecture la "mono-ligne" est destructrice, exemple :

 

boolean resultat = voiture.roule() ? feu.vert() ? support.autoroute() : stop() ? true : feu.rouge() ? voiture.enpanne() : false

 

Bon alors, c'est quoi le résultat ... ben heuuu, la couleur du moteur n'aurait-elle pas une influence sur le type de pneu ? 

 

 

Et oui, j'ai cette année plus de 25 ans de développement ... ouchhh .. dans mon cas, on parle plus de "garbage collector" bien que collector me va bien .. d'ailleurs, on parle de quoi .. j'ai un blanc ... humm un petit blanc, c'est une bonne idée ça ou un rouge... heuuu, pffft, c'est l'heure de la sieste non ? :-)

Partager ce message


Lien à poster
Partager sur d’autres sites

@Steven N’oublie pas de les mettre sur ton beau NAS tout neuf en cas de panne internet tu auras un peu de lecture :93:  :98:

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@mprinfo : 

Tout les temps que tu consacres à  faire des tutos est du temps gagné pour les autres. Donc merci pour nous tous. 

@mprinfo : +1

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu sais se tuto il ma fallu 15mn pour le faire le plus dur c'est de trouver les bonnes couleurs lol et surtour trouver les super explication de steven sur le forum dans un post perdu au fin fond d'un topic

Envoyé avec mon SmartPhone

Partager ce message


Lien à poster
Partager sur d’autres sites

Moi je suis content d'avoir arrêter le dév :)

Partager ce message


Lien à poster
Partager sur d’autres sites

+1 Nico :)

 

Pour l'opérateur ternaire, je ne savais même pas que l'on pouvait les imbriquer Steven. Après effectivement c'est des bonnes pratiques et du bon sens, d'ou ma question sur les librairies mais dommage qu'il y ait une restriction.

 

Concernant mprinfo, j'en avais déjà  parlé dans le membre du mois, mais merci beaucoup, en tant que débutant c'est que du bonheur ces tutos !

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci D-GK je debut aussi je me suis mis au lua fin janvier 2015

Envoyé avec mon SmartPhone

Partager ce message


Lien à poster
Partager sur d’autres sites

Par contre si quelqu'un veut des conseil pour une installation satellite multi satellite et plein de prises ca je mettrise

Envoyé avec mon SmartPhone

Partager ce message


Lien à poster
Partager sur d’autres sites

@Nico

Nous aussi on est content que tu ailles arrêté  :P

 

@mprinfo

Moi LUA c'est début 2014, j'ai un an d'avance sur toi et 3'543'234 ans de retard sur Krikroff  ;) Mais, de tout façon, il est hors quota et de plus il programme tellement mal que même chez Fibaro, quand ils copient son code, il le comprenne pas ... heinnnn comment ça c'est pas Krikoff qui code avec le pieds ... mais heuuu alors, vous voulez dire que c'est les développeurs de Fibaro qui sont pas au top ... Nooooonnn !

 

@D-GK

Attention, c'est du Java et non pas LUA:

Partager ce message


Lien à poster
Partager sur d’autres sites

Ah bon krikroff ne code qu avec les pieds je croyais qu'il avait aussi 2 main gauche lol

Envoyé avec mon SmartPhone

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×