[C#] typecast vs convert -> (int) vs System.Convert.ToInt32

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hi,

Weet iemand toevallig wat qua performance beter is te gebruiken? Een typecast of een convert?

In mijn ogen:
  • Typecast: (int)
  • Conversie: System.Convert.ToInt32()
Het voordeel van de system convert is dat ie, in integer geval, echt een numerieke input (bijv.string) verwacht en anders een exceptie gooit.

Dus als iemand gedachtes heeft hierover =) Dan hoor ik het wel.

Zelf lijkt mij typecast sneller omdat deze misschien lichter is? Maar dit is puur een aanname van mijzelf.

Statix

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
Een typecast zal ook wel een exceptie gooien als die niet lukt.
AFAIK is 'Convert' sneller, aangezien daar gebruik gemaakt wordt van de IConvertible interface, en er geen boxing/unboxing moet toegepast worden.

Stel je hebt deze code:
code:
1
2
object s = 5;
int i  = (int)s;

en
code:
1
2
object s = "5";
int i = Convert.ToInt32(s);

Dan levert dit respectievelijk volgende IL op:
code:
1
2
3
4
5
6
7
8
IL_0000:  ldc.i4.5
  IL_0001:  box        [mscorlib]System.Int32
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  unbox      [mscorlib]System.Int32
  IL_000d:  ldind.i4
  IL_000e:  stloc.1
  IL_000f:  ret

en
code:
1
2
3
4
5
6
IL_0000:  ldstr      "5"
  IL_0005:  stloc.0
  IL_0006:  ldloc.0
  IL_0007:  call       int32 [mscorlib]System.Convert::ToInt32(object)
  IL_000c:  stloc.1
  IL_000d:  ret


boxing / unboxing is een dure aangelegenheid, en mbhv de Convert class, vermijd je dat.

Hmm, dit levert toch wel een ander inzicht; moet ik eens van naderbij bekijken:
klik

[ Voor 8% gewijzigd door whoami op 27-11-2006 11:50 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke =)

Als ik dat mag geloven dan is de typecast toch sneller?

Het is namelijk een numerieke string (unboxed lijkt mij) wat gewoon een ander type, namelijk integer, moet worden.

Acties:
  • 0 Henk 'm!

  • PhysicsRules
  • Registratie: Februari 2002
  • Laatst online: 31-03 07:26

PhysicsRules

Dux: Linux voor Eenden

@whoami:
vindt de boxing niet al plaats bij
C#:
1
object s = 5;


De performacehit van de casting zit niet in de casting maar omdat je de value de heap op trapt. (er vindt een "expliciete" boxing plaats in je code).

[ Voor 13% gewijzigd door PhysicsRules op 27-11-2006 13:15 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb
C#:
1
2
string s = "1234";
int i = (int)s;


Dus geef wel een type op =)

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
laat me raden: die string komt vanuit een request.querystring?
doe dan dit:
code:
1
2
3
4
5
6
7
8
9
int value = 0;
try
{
    value = Convert.ToInt(stringValue);
}
catch
{
    // wrong input, revert to default, which is already set to 0
}

Je kunt ook Double.TryParse gebruiken maar dat is nogal nodeloos ingewikkeld. Zo pak je ook brakke input aan als "1323HALLO".

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
Verwijderd schreef op maandag 27 november 2006 @ 13:02:


Het is namelijk een numerieke string (unboxed lijkt mij) wat gewoon een ander type, namelijk integer, moet worden.
als je een value type in een reference type stopt, heb je een boxing operatie.
Als je een value type uit een reference type haalt, heb je een unboxing operatie.

Wat je dus bedoelt met 'unboxed' is me onduidelijk.
PhysicsRules schreef op maandag 27 november 2006 @ 13:14:
@whoami:
vindt de boxing niet al plaats bij
C#:
1
object s = 5;


De performacehit van de casting zit niet in de casting maar omdat je de value de heap op trapt. (er vindt een "expliciete" boxing plaats in je code).
Hier wordt er idd al geboxed. Echter, als je een cast doet, doe je ook een unbox.

[ Voor 32% gewijzigd door whoami op 27-11-2006 13:32 ]

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
whoami schreef op maandag 27 november 2006 @ 13:30:
[...]
als je een value type in een reference type stopt, heb je een boxing operatie.
Als je een value type uit een reference type haalt, heb je een unboxing operatie.

Wat je dus bedoelt met 'unboxed' is me onduidelijk.
dat er geen box operatie wordt uitgevoerd :P (duidelijk voor mij, na ik jouw antwoord ff heb gelezen)


Maar de string moet worden omgezet naar een integer.

Dit komt niet uit een query string ;-)

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
Maar die string zal toch in een variable van het type object zitten, want dit is niet mogelijk:
code:
1
2
string s = "5";
int i = (int)s;

Althans, in .NET 1.1 wordt daar een compiler error opgegeven.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
EfBe schreef op maandag 27 november 2006 @ 13:29:
laat me raden: die string komt vanuit een request.querystring?
doe dan dit:
code:
1
2
3
4
5
6
7
8
9
int value = 0;
try
{
    value = Convert.ToInt(stringValue);
}
catch
{
    // wrong input, revert to default, which is already set to 0
}

Je kunt ook Double.TryParse gebruiken maar dat is nogal nodeloos ingewikkeld. Zo pak je ook brakke input aan als "1323HALLO".
In .net 2.0 kan je toch beter gebruik maken van Int32.TryParse

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
whoami schreef op maandag 27 november 2006 @ 13:41:
Maar die string zal toch in een variable van het type object zitten, want dit is niet mogelijk:
code:
1
2
string s = "5";
int i = (int)s;

Althans, in .NET 1.1 wordt daar een compiler error opgegeven.
Sorry, het is niet op die manier ....

Ik ging even na kijken en kwam met quickwatch erachter dat
code:
1
        Session["Administration"]   6   object {int}
er in zit.

Met behulp van (int) wordt gezegd dat er een int in zit, zodat de methode wat een integer argument verwacht niet gaat zeuren.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:56
Je hebt dus een value type (integer) in een reference type (object) zitten, dus heb je wel een boxing/unboxing. ;)

Als je zeker weet dat er altijd een geldige integer in dat object zit, dan zou ik gewoon gaan type-casten, en anders de TryParse gebruiken.

Hoedanook, dit is zo'n micro-optimalisatie dat ik er mij niet al te druk zou over maken over evt performance issues

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
=)

In elk geval bedankt voor het mee denken. Alle beetjes qua performance helpen aan het eind natuurlijk altijd.

:9

Acties:
  • 0 Henk 'm!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
rwb schreef op maandag 27 november 2006 @ 13:50:
[...]

In .net 2.0 kan je toch beter gebruik maken van Int32.TryParse
Kan ook, komt op hetzelfde neer, alleen was .NET 2.0 niet gegeven (of ik heb niet verder gekeken dan mn neus lang is ;))

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com

Pagina: 1