none
Načtení kódu z externího souboru k urychlení programu?

    Dotaz

  • Mám takový problém. Možná je to základ, který jsem nějak nepostřehl - možná je to trivialita, ale na internetu jsem k tomuto tématu nic nenašel - asi špatně hledám. Potřeboval bych poradit. Jde o to, že mám program, který má velký kód a potřeboval bych ho urychlit.

    Příklad bych uvedl takto:

     

    if (pocetradku == 1) 
     {
     //Nyní následuje dlouhý kód - cca 800 řádků - jedná se o opakování stejného kódu, ale pokaždé pro jinou proměnnou. Příklad:
    
     if (promenna1 == "a")
      {
      //cca 6 řádkový kód
      } 
    
     if (promenna1 == "b")
     {
      //stejný 6 řádkový kód
     }
     // a tak to pokračuje dál dejme tomu že do "z".
    
     }
    // nyní následuje kód znovu s tím rozdílem, že počet řádků jsou dva. Takže se kód opakuje 2x pro každý řádek.
    if (pocetradku == 2) 
     {
    
     if (promenna1 == "a")
      {
      //cca 6 řádkový kód
      } 
    
     if (promenna1 == "b")
     {
      //stejný 6 řádkový kód
     }
     // a tak to pokračuje dál dejme tomu že do "z". Nyní se však spouští i kontrola proměnné2 pro druhý řádek:
     if (promenna2 == "a")
      {
      //cca 6 řádkový kód
      } 
    
     if (promenna2 == "b")
     {
      //stejný 6 řádkový kód
     }
     // a tak to pokračuje dál dejme tomu že do "z".
     }
    

     

    Protože je to dlouhé a neefektivní, potřeboval bych poradit jak zefektivnit, urychlit kód. Napadlo mě vyřešit to třídami, ale moc se mi to nedaří. Pak mě napadlo, že by bylo možné tyto kusy kódů vložit do externích souborů, z kterých by se načítaly do hlavního souboru. Takže bych pak jednotlivé funkce volal odtud. Je možné nějakým způsobem provést čtení z externích tříd/ souborů? 

    Mám představu, že by výsledný kód vypadal asi takto:

     

    if (pocetradku == 1) 
     {
     kontrolaprvnihoradku();
     //nějaké vyhodnocení
     }
    if (pocetradku == 2)
     {
     kontrolaprvnihoradku();
     kontroladruhehoradku();
     //nějaké vyhodnocení
     }
    
    // a v externím souboru - např. TextFile1.txt by bylo
    public class kontrolaprvnihoradku
     {
     if (promenna1 == "a")
      {
      //kód...
      }
     }
    
    // zkoušel jsem to dát do externí třídy ale kvůli proměnným, které jsem vytvořil v hlavním programu, mi to nefungovalo.
    

    Nevím, jak s tím dál pokročit. Zkoušel ty třídy, ale nefungovalo mi to. Musel bych to dělat v hlavním souboru? (vytvořit metodu?) Bylo by možné číst z nějakého externího souboru, volat vzdáleně, nebo nějak program urychlit?

    Moc Vám děkuji předem za odpověď.

     

    sobota 15. ledna 2011 18:38

Odpovědi

  • Pokud se opakující se kód přesune do procedury, tak se nic neurychlí, protože nastane další režie při zpracování parametrů atd., jen se zkrátí délka programu a program bude čitelnější, ale i to má své výhody.

    Konstrukce, kterou jste použil lze též napsat lépe. Např.:

    if (promenna1 == "a")
      {
      //cca 6 řádkový kód
      }

    if (promenna1 == "b")
    {
      //stejný 6 řádkový kód
    }
    // a tak to pokračuje dál dejme tomu že do "z".
     }

    se nahradí snadno:

    if (promenna1 >= "a" && promenna1 <= "z")
      {
      //cca 6 řádkový kód
      }


    Kontrolu více řádků bude nejspíš vhodné udělat v cyklu ihned po načtení každého z nich.

    Celkové urychlení je skoro vždycky možné, ale to záleží na tom, co program dělá. V tomto okamžiku bych se soustředil na funkčnost a srozumitelnost kódu. Urychlovat se může začít později.

    Před dalším pokračováním ještě navrhuji zajít do knihkupectví a prolistovat pár knih o C#, pokud se vám některá zalíbí, tak to bude dobrá investice.

    pátek 21. ledna 2011 13:28

Všechny reakce

  • Pokud se opakující se kód přesune do procedury, tak se nic neurychlí, protože nastane další režie při zpracování parametrů atd., jen se zkrátí délka programu a program bude čitelnější, ale i to má své výhody.

    Konstrukce, kterou jste použil lze též napsat lépe. Např.:

    if (promenna1 == "a")
      {
      //cca 6 řádkový kód
      }

    if (promenna1 == "b")
    {
      //stejný 6 řádkový kód
    }
    // a tak to pokračuje dál dejme tomu že do "z".
     }

    se nahradí snadno:

    if (promenna1 >= "a" && promenna1 <= "z")
      {
      //cca 6 řádkový kód
      }


    Kontrolu více řádků bude nejspíš vhodné udělat v cyklu ihned po načtení každého z nich.

    Celkové urychlení je skoro vždycky možné, ale to záleží na tom, co program dělá. V tomto okamžiku bych se soustředil na funkčnost a srozumitelnost kódu. Urychlovat se může začít později.

    Před dalším pokračováním ještě navrhuji zajít do knihkupectví a prolistovat pár knih o C#, pokud se vám některá zalíbí, tak to bude dobrá investice.

    pátek 21. ledna 2011 13:28
  • Jenom bych doplnil, že přesun kódu do procedury nutně nemusí znamenat zpomalení díky režii volání procedury, protože C# compiler při kompilaci provádí optimalizace (pokud jsou zapnuty), kterými krátké procedury inlinuje a v podstatě vrátí kód na původní místo. Je to pak přehledné pro programátora a rychlé pro běh.
    Robert Haken, Microsoft MVP ASP/ASP.NET, HAVIT, s.r.o., www.havit.cz, http://knowledge-base.havit.cz
    úterý 29. března 2011 21:45
    Moderátor