In het project waar ik mee bezig ben wilden we in een DataGridView voor- en achtergrond kleuren van kolommen kunnen binden aan de datasource van de DataGridView. En dat is op zich geen probleem en is ook prima gelukt.
Omdat Reflection in dit opzicht een behoorlijke performance penalty is heb ik hiervoor een helper geschreven die met Reflection.Emit een method maakt die direct een waarde uit de datasource kan plukken ongeacht wat voor type dat is (DataSet, business objecten etc). Deze method zorgt er dus voor dat ik niet bij elke paint actie met reflection aan de gang moet om via PropertyInfo's en Invoke() calls waarden op te halen.
Goed voor zover de inleiding. Waar ik nu nog mee zit is het volgende. In de IL code zit er een paar keer het volgende:
Het lijkt mij vrij overbodig om eerst de waarde van de stack af te halen en in een local te zetten aangezien hij erna toch weer gebruikt wordt
Ik heb het zo geklust omdat de C# compiler dit ook zo doet (beter goed gejat dan slecht bedacht).
Mijn vraag is dus als volgt; kun je die stloc/ldloc combinatie weglaten als je met de waarde die nu op de stack staat verder wil werken? Dus zo:
of
Of is dit iets voor synchronisatie of iets anders dat ik over het hoofd zie?
Omdat Reflection in dit opzicht een behoorlijke performance penalty is heb ik hiervoor een helper geschreven die met Reflection.Emit een method maakt die direct een waarde uit de datasource kan plukken ongeacht wat voor type dat is (DataSet, business objecten etc). Deze method zorgt er dus voor dat ik niet bij elke paint actie met reflection aan de gang moet om via PropertyInfo's en Invoke() calls waarden op te halen.
Goed voor zover de inleiding. Waar ik nu nog mee zit is het volgende. In de IL code zit er een paar keer het volgende:
code:
1
2
3
| L_001f: unbox.any int32 L_0024: stloc.1 L_0025: ldloc.1 |
Het lijkt mij vrij overbodig om eerst de waarde van de stack af te halen en in een local te zetten aangezien hij erna toch weer gebruikt wordt
Mijn vraag is dus als volgt; kun je die stloc/ldloc combinatie weglaten als je met de waarde die nu op de stack staat verder wil werken? Dus zo:
code:
1
2
| L_001f: unbox.any int32 L_0024: ret |
of
code:
1
2
3
| L_001f: unbox.any int32 L_0024: ldarg.2 L_0025: ceq |
Of is dit iets voor synchronisatie of iets anders dat ik over het hoofd zie?
Nu met Land Rover Series 3 en Defender 90