Esta pregunta ya ha sido bien respondida, sin embargo, hasta ahora ha faltado números duros.
Over 100000000 iterations
AS : Failure 00:00:00.9282403
Cast : Failure 00:00:00.9868966
AS : Success 00:00:00.9350227
Cast : Success 00:00:01.1382759
Las cifras constantemente regresan en estas proporciones
Quiero señalar que la única conclusión a la toma de estas cifras es que desde el punto de vista del rendimiento, hay muy poco que ganar eligiendo uno de estos métodos sobre el otro. Hay muy poco en la diferencia para una sola llamada (donde muy poco tiende a cero). Dicho esto, "como" es más rápido :)
Después de eso, las cifras anteriores en su mayoría son razonables.
"Como" tarda más en fallar que en éxito. En caso de éxito no sucede nada, el valor puede usarse tal cual, o simplemente copiarse. En caso de falla, se requiere un salto para copiar una referencia nula.
"Emitir" es más rápido en el fracaso, una llamada a "es" y no hace más. En el caso del éxito es mucho más lento, tiene el encabezado de la llamada al "es" y luego al elenco.
Sin embargo me sorprende que en caso de fallo moldeada lleva más tiempo que como insuficiencia
Editar
Conforme a lo solicitado, las cifras de molde en un bloque try/catch
Over 100000000 iterations
Catch : Failure 05.05:00:00 // approximately, because I didn't hang around
Catch : Success 00:00:01.4000952
El código que produjo el primer conjunto de figuras
class Program
{
const int ITERATION_COUNT = 100000000;
private static UInt64 stringCount = 0;
private static UInt64 objectCount = 0;
static void Main(string[] args)
{
Console.WriteLine("Over {0} iterations ", ITERATION_COUNT);
string s = "Hello";
object o = new Int32();
RunTest("AS : Failure {0}", TestAs, o);
RunTest("Cast : Failure {0}", TestIs_And_Cast, o);
RunTest("AS : Success {0}", TestAs, s);
RunTest("Cast : Success {0}", TestIs_And_Cast, s);
Console.WriteLine("Press any key to stop");
Console.ReadKey();
}
private static void RunTest(string testDescription, Action<object> testToRun, object arg)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < ITERATION_COUNT; i++)
testToRun(arg);
sw.Stop();
Console.WriteLine(testDescription, sw.Elapsed);
}
static void TestAs(object obj)
{
string s = obj as string;
if (s != null)
stringCount++;
else
objectCount++;
}
static void TestIs_And_Cast(object obj)
{
string s = null;
if (obj is string)
{
s = (string)obj;
stringCount++;
}
else
objectCount++;
}
}
Mirando las respuestas, creo que "es" es solo saber si algún objeto es un tipo, y ellos hacen algo de acción, y no solo un yeso. Ejemplo: if (obj es ClassManager) {Write ("Usted es un gerente")} –