Optimalizace kódu

Odpovědět
Axamith
Příspěvky: 533
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Optimalizace kódu

Příspěvek od Axamith » 11 dub 2024, 17:58

Mám rozpracovaný na mé poměry dosti složitý kód, dostal jsem se do situace, kdy flash paměť byla z 95 % zaplněna. Pustil jsem se do optimalizace. Dostal jsem se na cca 80%. Když jsem "uklízel v setupu, zjistil jsem zajímavou věc. Mám tam kus kódu, který mi vypisuje hodnoty z EEPROM. Běžně ho mám zakomentovaný a jen když potřebuji info, uvolním ho.
Zakomentavaný kód dává velikost programu 79 %
Když ho uvolním, tak 68 % (???)
když tuto část kódu smažu, program má opět 79 %

Přikládám část Setup, ve kterém je zakomentovaná sporná část vypisující eeprom. Nevkládám celý kód, je to přes 2000 řádků kódu ...
Napadá někoho, proč se takto zvláštně chová?

Kód: Vybrat vše

void setup() {
  Serial.begin(9600);
/*
//===============  
for (long i = 0; i <= adressMax; i++) {
    if (countE == 0) {
      Serial.print("EEPROM ");
      Serial.print(i);
      Serial.print(": ");
    }
    Serial.print(EEPROM.read(i));
    countE ++;
    if (countE < 10) Serial.print(", ");
    if (countE == 10) {
      Serial.println();
      countE = 0;
    }
  }
  while (1) delay(1000);
//===============
*/

RezimPrace = 0;
ss = 0;
mode = 0; // 0 = listovani PGM, 1 = zvratny, 2 = radialni, 3 = manual L, 4 = manual R
pgm = 1;

  SetupMillis = SetupMillis * 1000; // převod sec. na milisec.
  LCD_head ();
  Keypad(); // čtení klávesnice
  setup_progressbar();

      if (ZnakKey == 65)  { // Menu nastaveni >>> F1
            AktualMillis = millis();
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Setup program");
            SettingMode = 1;
            KeyValue = 1;
           // edit_pgm = 99;
            delay(1000);          
            menu ();
}
      if (ZnakKey == 66)  { // Nastaveni zrychlení motoru >>> F2
            AktualMillis = millis();
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Setup motor");
            SettingMode = 2;
            KeyValue = 1;
            delay(1000);
            Setupmotor ();
}            
      if (ZnakKey == 68)  { // Tovarni nastaveni >>> F4
            lcd.clear();
            lcd.setCursor(0, 0);
            lcd.print("Original settings");
            delay(2000);
  EEPROM.write(200, 255); // priprava pro reset EEPROM
  EepromSetings ();
   }
  for(int i=5;i<9;i++){ // nastavení pinu PWM
   pinMode(i,OUTPUT);
  }
   for(int i=5;i<9;i++){ // pocatecni stav pinu PWM
   digitalWrite(i,LOW);
  }

}


AstroMiK
Příspěvky: 593
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Optimalizace kódu

Příspěvek od AstroMiK » 11 dub 2024, 18:51

Jen nepotvrzená teorie:
Myslím, že když překladač zjistil, že by se mu celý kód (včetně té odkomentované části) už nevešel do procesoru, tak zapnul vyšší optimalizaci.

Axamith
Příspěvky: 533
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Optimalizace kódu

Příspěvek od Axamith » 11 dub 2024, 19:19

Teoreticky ano. Je zajímavé, že se nesnažil optimalizovat při zaplnění paměti na 95 %. Úprava jiné části kódu se takhle nechovala, alespoň jsem ji nezaregistroval.
Jako vedlejší produkt celé akce je, že jsem se naučil psát kód úsporněji :-D

Uživatelský avatar
gilhad
Příspěvky: 789
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Optimalizace kódu

Příspěvek od gilhad » 12 dub 2024, 02:15

Pokud se ti celý program vejde do flash, tak ho není potřeba zmenšovat z je jedno, jestli je flash zaplněná z půlky, 90%, nebo nezbývá ani jeden volný byte.
Teprve až začne jeden volný byte chybět, je nutno to potimalizovat na velikost..
(Není chyba psát úsporně od začátku, ale je chyba přehnaně optimalizovat, dokud program není plně funkční a není potřeba nějakou optimalizaci dělat - půlka flash volná ti nijak nepomůže - teda až na to, že můžeš v budoucnu přidávat další a dlaší kód)

Uživatelský avatar
gilhad
Příspěvky: 789
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Optimalizace kódu

Příspěvek od gilhad » 12 dub 2024, 02:18

Ještě jak koukám na ten kód, tak po jeho odkomentování může překladač dojít k závěru, že po while(1) už nic dalšího nepoběží a tak odoptimalizovat konec té funkce :)

Axamith
Příspěvky: 533
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Optimalizace kódu

Příspěvek od Axamith » 12 dub 2024, 15:55

Hřebíček na hlavičku, dělalo to while (1).
Optimalizaci jsem začal dělat při cca 95 % flash a když jsem viděl, co toho ještě musím dopsat.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 40 hostů