• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    TENCOKACISTROMYProgramovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
    PJOTRIK
    PJOTRIK --- ---
    PJOTRIK: "tenhle code analyzer" mel byt https://github.com/SergeyTeplyakov/ErrorProne.NET , nevim co ten odkaz po ceste spolklo
    MAIMONIDES
    MAIMONIDES --- ---
    PJOTRIK: Situace, kterou to řeší je, že máš někde velký structy a předáváš si je v parametru bez refu a bereš je jako readonly a zároveň je to v něčem časově kritickym. Trochu teoretická situace.
    PJOTRIK
    PJOTRIK --- ---
    MAIMONIDES: Ja vnimam jako uzitecny i samotny fakt ze deklaruju ze parametr je "in", zvysena rychlost je fajn, ale resil bych ji jen na konkretnich mistech na hot path (a to jsem nijak nemeril).
    Chybu jsem v te souvislosti objevil jednu, netykala se ale konkretne in parametru. Na upravy jsem vyuzil tenhle code analyzer, ktery odchytil ze nekdo pouzil KeyValuePair jako klic v Dictionary.

    MORMEGIL: ale jo, smysl to dava, ale libilo by se mi kdyby kompilator umel rozlisit ty opravdu problematicky pripady a ty kde se lambda pouziva jen treba kvuli citelnosti. Na druhou stranu, to ze se tam pouziva takova konstrukce asi znamena ze to nebude nekde uvnitr vykonnostne kritickyho mista, tak se to da chapat i jako signal ze tady ten "in" parametr neni potreba.

    A u toho dynamic dispatche teda nechapu ani duvod.
    JANFROG
    JANFROG --- ---
    MORMEGIL: To je validni pohled. Pak se najdou jini, kteri jsou nastvani ze to "funguje jen nekdy" (coz je tedy pripad temer vseho v .NET ceho jsem dotkl - pravda, neni toho moc :-)

    Ja osobne radeji preferuji ortogonalitu, kam vede tenhle pristup "nejdulezitejsi je vykonostni optimalizace" je videt pekne na C++.
    Ale to jsme OT, ja jen odpovidal na MORMEGIL a MORMEGIL
    MORMEGIL
    MORMEGIL --- ---
    MAIMONIDES: Tak primární motivací je výkonnostní optimalizace (méně kopírování), úplně bych nečekal, že se tím odhalí nějaká chyba… (Jedinou možnost vidím v tom, že někdo ve struktuře předávané hodnotou něco změní, protože si myslí, že se to projeví někde jinde, ale to je vcelku obskurní scénář, řekl bych.)
    MAIMONIDES
    MAIMONIDES --- ---
    PJOTRIK: a odhalilo to zavádění jedinou chybu nebo přineslo nějakej užitek?
    MORMEGIL
    MORMEGIL --- ---
    JANFROG: Jasně, ale to mi právě přijde, že je úplně proti smyslu celé té konstrukce, sloužící k výkonnostní optimalizaci, aby se všechno předávalo bez kopírování. Pokud něco takového potřebuju, tak si to holt někde na heapu alokuju sám, zatímco pokud by mi jazyk umožnil to dělat automaticky s tím, že mi tam občas skrytě přidá nějakou alokaci nebo dokonce kopii, tak asi budu dost naštvaný, řekl bych.
    JANFROG
    JANFROG --- ---
    MORMEGIL: Tak, detaily se mohou lisit (a v tech je dabel), ale pro pristup k nelokalnim promennym lze pouzit dve metody (zjednodusene):
    1) implementacne jednodussi je alokovat tyhle promenne ve skutecnosti na heap v "tempvector" a propagovat constantni referenci na ten "tempvector"
    2) o neco slozitejsi je alokovat na stacku a detekovat situaci, kdy se lambda "ulozi do globalni promenne" (a jine pripady) a zaroven dojde k ukonceni te metody, na jejimz stacku ta promenna (promenne) byla (byly) a v tom pripade referenci "evakuovat" na heap.

    1) je jednodussi, ale platis alokaci na heap pri kazde aktivaci metody ktera to potrebuje, 2) je slozitejsi ale v pripadech kdy lambda neprezije aktivaci vnejsi metody je overhead mensi (overhead pri "evakuaci" je v pravde desivy).

    Implementoval jsem oboji zpusob, udelat 2) spravne a rychle je netrivialni (= zesedivis z toho :-), ale zda se mi, ze to vychazi vykonove lepe (ale tohle se blbe meri)
    MORMEGIL
    MORMEGIL --- ---
    JANFROG: Jak?
    JANFROG
    JANFROG --- ---
    MORMEGIL: To je IMHO resitelne...
    MORMEGIL
    MORMEGIL --- ---
    PJOTRIK: No a jak čekáš, že by tam in/ref/out parametry fungovaly? Ta proměnná někde leží (třeba na stacku nějaké funkce o pět úrovní volání výše) a ty ji použiješ v lambdě, kterou si uložíš do globální proměnné a necháš ji tam ještě hodinu, když už ta metoda, na jejímž stacku ta proměnná ležela, dávno skončila…
    VITI
    VITI --- ---
    PJOTRIK: no ja udrzuju jednu wpf devex aplikaci, neni to zadny graficky high end, vicemene rad pouzivam datagrid, ostatni tak spis z donuceni, ale zadny extra problemy neregistruju.
    TOOMIX
    TOOMIX --- ---
    PJOTRIK: WPF ne, ale cca 14 let kupujem WinForms, co Ti tam nejde? Bude to nejspíš podobný
    PJOTRIK
    PJOTRIK --- ---
    Nejake zkusenosti s DevExpress WPF komponentama?
    U nas jsme to zkusili par mesicu pouzivat a v podstate jsme nenarazili na pripad kdy by byly nejak prinosny... pokazdy jsme skoncili na nejakym bugu nebo nutnosti komponentu ohybat stejne hodne jako bysme pouzili zakladni wpf
    PJOTRIK
    PJOTRIK --- ---
    Jsem ted prvne zkousil do naseho kodu zavest "in" parametry a dost neprijemne me prekvapilo kolik to ma omezeni
    - neda se takovy parametr pouzit uvnitr lambdy
    - nejde to pouzit v iteratorech, tj IEnumerable metodach co pouzivaj yield
    - metodu s in parametrem nejde volat pres dynamic dispatch
    CERMI_FOX
    CERMI_FOX --- ---
    NECROMAN:
    SMOKY: asi fakt záleží na projektu, znám dva lidi, co tam dělali a moc se jim tam nelíbilo.
    VITI
    VITI --- ---
    NECROMAN: ex kolega je spokojeny.
    SMOKY
    SMOKY --- ---
    NECROMAN: Záleží na projektu. Já sem tam byl spokojený.
    NECROMAN
    NECROMAN --- ---
    Práce na .NETu v Barclays, ano či ne? Máte nějaké zkušenosti?
    TOOMIX
    TOOMIX --- ---
    FREELA: jestli chceš dělat winforms, tak ještě zůstan u .NET Framework 4.8, jinak rovnou přejdi na .NET Core 3.1
    Kliknutím sem můžete změnit nastavení reklam