Henselmanuv seznam IT otázek pro pohovory V.

MyEgo.cz

home foto blogy mywindows.cz kontakt

Henselmanuv seznam IT otázek pro pohovory V.

a máme tu další díl seriálu věčné nevědomosti....aneb tohle nikdy neskončí.

21. Může být DateTime null?

Nemůže, jelikož to není třída (class), ale struktura (struct).

22. Co je to JIT? Co je to NGEN? Jaké jsou výhody a nevýhody obou?

JIT - Just In Time

- JIT je zkratka označující způsob zpracování kodu. Hlavním účelem JIT kompilace je docílení optimalizované kompilace, která se provádí až těsně před spuštěním kódu. To má za následek celkově delší dobu spuštění, tzv. startup time delay. Tento nedostatek však plně vyváží optimalizovaný kód, který je kompilován s ohledem na prostředí, procesor či paměť a který urychlí běh aplikace oproti statické kompilace během vývoje.

NGEN - Native Image Generator

- NGen využívá pro urychlení běhu programu metodu, kde se při prvním spuštění vytvoří optimalizovaný, zkompilovaný obraz assembly a uloží se do cache v lokálním úložišti. Při opakovaném přístupu pak již nedochází k opětovné kompilaci, ale assembly se bere z cache, čímž se urychlí běh programu. Ke kompilaci se využívá algoritmu, která používá JIT kompilace.

- při vytváření obrazu může docházet jen k částečné kompilaci, v důsledku volání externích objektů, nedostatku přístupových práv a podobných příčin. Ty části, které nejsou kompilované do obrazu, jsou kompilovány pomocí JIT.

Výhody:

JIT - optimalizovaný kód, rychlejší běh aplikace

NGen - optimalizovaný kód, rychlejší běh aplikace

Nevýhody:

JIT - časová náročnost během počáteční kompilace

MGen - přístup do lokálního uložiště, částečná kompilace

23. Jak je v probíhá správa objektů v garbage kolekci v .Net CRL? Co je to nedeterministická finalizace? Garbage Collection (GC) na základě metadat rozhoduje o objektech v paměti, zda budu uvolněny či ponechány. GC rozděluje objekty do dvou skupin, Strong a Weak reference. Strong reference podporuje oživení objektu oproti Weak referenci, ale zase je náročnější na paměť a správu.

Případné zájemce o hlubší informace o GC odkáži na tento podrobný článek.

Předně, zde je odkaz na stručný popis výrazu nedeterministický dostupný případně i v angličtině. Nedeterministická finalize je označení pro postup odstranění objektů s garbage kolekce. Objekty nejsou odstraněny z kolekce na základě volaní Finalize na jednotlivých objektech, ale na základě vnitřního algoritmu Garbage Collection (GC). To znamená, že když se na daném objektu zavolá Finalize metoda, tak to ještě neznamená, že dojde k okamžitému uvolnění paměti. O uvolnění paměti rozhodne GC na základě vnitřního stavu a případných potřeb systému. Tento přístup je v podstatě použit u C# k usnadnění práce s pamětí a objekty a odstiňuje programátory od správy paměti.

Obsáhlý článek v angličtině o Garbage Collection najdete zde.

24. Jaký je rozdíl mezi Finalize() a Dispose()?

Finalize() je volána vnitřně pomocí garbage Collection a Dispose je volána programátorem v kódu.

Finalize() metoda je protected a může být přepsána v případě potřeby. Speciálně vhodná pro manuální uvolnění Unmanaged Resource, jako je například otevřené spojení do DB nebo Internetu a podobně.

Doporučení pro odstranění Unmanaged Resources:

  1. Implementovat IDisposable a přepsat metofu Finalize
  2. V přepsané metodě zavolat metodu GC.SuppressFinalyze(this);

Příklad použití:

Public class SqlConnection : IDisposable, IDbConnection  {
    private void Cleanup()  
    {
        // Release unmanaged resource  
    }  
    public void Dispose()  
    {
        Cleanup();  
        GC.SuppressFinalize(this);  
    }  
    protected override void Finalize()  
    {
        Cleanup();  
    }  
}

Jestli se divíte, proč je v protected override void Finalize() volána zase CleanUp metoda, tak to je pro případ, že nějaký zapomnětlivý programátor zapomene zavolat Dispose nebo nepoužije ideální kostrukci Using. V tomto případě je Finalize metoda volána automaticky pomocí GC a pokud bychom nezavolali CleanUp metodu, nedošlo by k požadovanému uvolnění.

25. Proč je dobré používat Using() konstrukci? Co je IDisposable? Jak IDisposable podporuje deterministickou finalizaci?

Using konstrukce zajistí automatické volaní Dispose metody v rájmci defnovaného rozsahu. Nejlepé vystihne podstatu příklad. Ukázka z volání update metody CSLA business objektu:

protected override void DataPortal_Update() {
    Database database = DatabaseFactory.CreateDatabase();
   DbCommand command = database.GetStoredProcCommand(SQLUPD);

   using (DbConnection connection = database.CreateConnection()) {
      connection.Open();
      DbTransaction transaction = connection.BeginTransaction();
      try {
         this.AddCommonParameters(database, command);
         database.AddInParameter(command, SQLRV, DbType.Binary, _rowVersion);
         database.AddOutParameter(command, SQLNRV, DbType.Binary, 8);

         database.ExecuteNonQuery(command);

         _rowVersion = (byte[])database.GetParameterValue(command, SQLNRV);
         transaction.Commit();
      } catch {
         transaction.Rollback();
         throw;
      }
   }
}

IDisposable je rozhrani definující metodu Dispose(), určenou pro uvolnění prostředků používanou danou třídou.

V .Net nelze docílit úplné deterministické finalizace, jelikož programátor nemá kontrolu nad konečným uvolněním použitých prostředků, objektů. Avšak implementace IDsiposable rozhraní definuje životní cyklus daného objektu a tím ulehčeje GC identifikaci objektů vhodných pro uvolnění.


Nový komentář