este k tym zlozenym podmienkam

Jan Waclawek konfera na efton.sk
Pátek Duben 12 11:43:44 CEST 2024


> 1. Jak ale poznáte, že máte volat ZmenaZlozenejPodmienky?

Vzdy, ked sa zmeni ktorakolvek z podmienok, ktore do tej zlozenej podmienky
vstupuju.
Pripominam, ze sa to oplati, len
>> ak sa zlozena podmienka vypocitava casto ale meni zriedkavo

Samozrejmym predpokladom je, ze tie podmienky nie su "ciste volatile", t.j.
sa nemenia bez zasahu programu. 
(Dalsim suvisiacim tichym predpokladom je atomicita, t.j. ze sa veci
nemenia "poza chrbat" v preruseniach/RTOS; ale do toho tu nechodme).

Napriklad, majme program, v ktorom sa nejako meria teplota a tlak, a v
mnohych pripadoch je potrebne vediet, ci su oba v nejakych medziach.
Takze namiesto

if (1
  && (teplota >= MINIMALNA_TEPLOTA) 
  && (teplota <  MAXIMALNA_TEPLOTA) 
  && (tlak    >= MINIMALNY_TLAK) 
  && (tlak    <  MAXIMALNY_TLAK) 
) {
  // vsetko je v poriadku, mozeme zacat hybat ventilom X
} 

robim toto:

_Bool suNormalnePodmienky;
void VypocitajNormalnePodmienky(void) {
  suNormalnePodmienky =(1
    && (teplota >= MINIMALNA_TEPLOTA) 
    && (teplota <  MAXIMALNA_TEPLOTA) 
    && (tlak    >= MINIMALNY_TLAK) 
    && (tlak    <  MAXIMALNY_TLAK) 
  );
}
...
lokalna_premenna stara_teplota = teplota;
teplota = VypocitajTeplotu();
if (stara_teplota != teplota) VypocitajNormalnePodmienky();
...
lokalna_premenna stary_tlak = tlak;
tlak = VypocitajTlak();
if (stary_tlak != tlak) VypocitajNormalnePodmienky();
...
if (suNormalnePodmienky) {
  // mozeme zacat hybat ventilom X
}

(C++-kari v tomto bode zacnu rozrusene mavat rukami a vykrikovat, ze predsa
na toto su uplne idealne (gettery a) settery, alebo nieco ine objektovite,
kde toto moze prebehnut automaticky. Mozno maju pravdu, ale ci vyhody
prevazuju nad nevyhodami, je na dalsiu diskusiu.)

2. Cortex-M3/4 neznám, ale pokud ten mechanismus urychlí vyhodnocení a 
je to důležité, pak má určitě přednost před přehledností.

Ja by som tu urcite nepouzil slovo urcite. Je dolezite, ci urcite to
urychlenie je dolezite.
;-)

wek


----- Original Message ---------------

Subject: Re: este k tym zlozenym podmienkam
   From: Martin Záruba <swz na volny.cz>
   Date: Fri, 12 Apr 2024 11:05:20 +0200
     To: hw-list na list.hw.cz

1. Jak ale poznáte, že máte volat ZmenaZlozenejPodmienky?

2. Cortex-M3/4 neznám, ale pokud ten mechanismus urychlí vyhodnocení a 
je to důležité, pak má určitě přednost před přehledností.

Martin Záruba

Dne 12.4.2024 v 10:26 Jan Waclawek napsal(a):
> Vcera zhodou okolnosti som mal "prilezitost" sa na takych zlozenych
> podmienkach vyburit, a tak by som este rad doplnil dve navzajom pribuzne,
> relativne marginalne optimalizacne techniky, ktore pouzivam:
>
> 1. ak sa zlozena podmienka vypocitava casto ale meni zriedkavo, tak si ju
> "predpocitavam" do pomocnej premennej (sam pre seba to volam "cache", aj
> ked to nie je asi spravne z pohladu standardneho pouzitia toho slova).
> T.j. namiesto
> if (podmienka1 && podmienka2 && podmienka3) {}
> napisem
> if (zlozenaPodmienka) {}
> a vzdy ked sa meni podmienka1, podmienka2, podmienka3 tak zavolam
> void ZmenaZlozenejPodmienky(void) {
>    zlozenaPodmienka = podmienka1 && podmienka2 && podmienka3;
> }
>
> 2. ak podmienky su bitove stavy, tak ich s oblubou skladam do bytu/wordu,
> kde potom namiesto testu s && staci otestovat cely byte/word na nulu.
> Na toto sa da s vyhodou vyuzit bit-banding v Cortex-M3/4 (resp. bitova
> oblast v '51, bit-banding na rozhrani pamati v niektorych Kinetisoch,
> apod.)
>
> Obe tieto techniky maju pomerne zasadny nedostatok v tom, ze na prvy pohlad
> "nie je vidiet" pouzitie tych jednotlivych podmienok.
>
> wek
>


Další informace o konferenci Hw-list