Mest effektive måten å teste objekttype

stemmer
18

Jeg har verdier lagret som strenger i en DataTablehvor hver verdi virkelig kunne representere en int, doubleeller string(alle ble omdannet til strenger under en import prosess fra en ekstern datakilde). Jeg trenger å teste og se hva slags hver verdi egentlig er.

Hva er mer effektiv for programmet (eller er det ingen praktisk forskjell)?

  1. Prøv å konvertere til int(og da double). Hvis konverterings fungerer, retur true. Hvis et unntak, tilbake false.
  2. Regulære uttrykk designet for å matche mønsteret av en intellerdouble
  3. En annen metode?
Publisert på 05/08/2008 klokken 07:49
kilden bruker
På andre språk...                            


5 svar

stemmer
9

Vil bruke double.TryParse, har den ytelsesfordeler.

Svarte 05/08/2008 kl. 07:54
kilden bruker

stemmer
6

Jeg vil si, ikke bekymre deg så mye om slike mikro ytelse. Det er mye bedre å bare få noe å jobbe, og deretter gjøre det så klart og konsist og lett å lese som mulig. Det verste du kan gjøre er å ofre lesbarhet for en ubetydelig mengde av ytelse.

Til slutt, den beste måten å håndtere ytelsesproblemer er å spare dem for når du har data som indikerer at det er en faktisk ytelse problem ... ellers vil du tilbringe mye tid på mikro-optimalisering og faktisk føre til høyere vedlikeholdskostnader for senere.

Hvis du synes dette parsing situasjonen er virkelig en flaskehals i programmet, så er det på tide å prøve og finne ut hva den raskeste måten å løse problemet er. Jeg tror Jeff (og mange andre) har blogget om denne typen ting mye.

Svarte 05/08/2008 kl. 08:04
kilden bruker

stemmer
5

Problemet du har er at det kan være situasjoner der svaret kan være alle tre typer.

3 kan være en int, en dobbel eller en streng!

Det avhenger av hva du prøver å gjøre, og hvor viktig det er at de er en bestemt type. Det kan være best bare å la dem som de er, så lenge du kan eller, alternativt, noen opp med en metode for å markere hver enkelt (hvis du har kontroll over kilden til den opprinnelige strengen).

Svarte 23/09/2008 kl. 21:38
kilden bruker

stemmer
5

Du får forskjellige resultater for de ulike metoder avhengig av om du kompilere med optimaliseringer på. Du har i utgangspunktet noen alternativer:

object o;

//checking with is
o is int

//check type
o.GetType() != typeof( int )

//cast and catch exception
try{ int j = (int) o; } 
catch {}

//use the tryparse
int.TryParse( Convert.ToString( o ), out j )

Du kan enkelt sette opp en konsoll app som prøver hver av disse 10.000 ganger og returnerer varigheter for hver (test når o er en int og når det er noe annet).

Den try-catchmetoden er den raskeste hvis objektet er i besittelse av en int, og den aller langsomste hvis den ikke gjør det (enda langsommere enn GetType). int.TryParseer ganske rask hvis du har en streng, men hvis du har et ukjent objekt det er tregere.

Interessant, med .Net 3.5 og optimaliseringer slått på o is intsjekken tar samme tid som try-catchda o faktisk er en int. o is inter bare litt saktere hvis o faktisk er noe annet.

Annoyingly FxCop vil kaste opp advarsler hvis du gjør noe sånt som:

if( o is int )
    int j = (int) o;

Men jeg tror det er en feil i FxCop - det vet ikke int er en verditype og anbefaler deg å bruke o as inti stedet.

Hvis dine innspill er alltid en streng int.TryParsesom er best, ellers isoperatøren er raskest.

Som du har en streng vil jeg se på om du trenger å vite at det er en int, i stedet for en dobbel. Hvis int.TryParsegår da så vil double.TryParseså du kunne halvparten av antall kontroller - returnere enten dobbel eller streng og gulv dobler når du forventer en int.

Svarte 10/08/2008 kl. 17:43
kilden bruker

stemmer
3

Jeg vil personlig bruker int.tryparse, så double.tryparse. Ytelse på disse metodene er ganske rask. Begge returnere en boolsk. Hvis både mislykkes da har du en streng, per hvordan du har definert dine data.

Svarte 05/08/2008 kl. 08:02
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more