На этот вопрос уже был получен хороший ответ, однако до сих пор не было точных цифр.
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
Цифры последовательно возвращаются в этих пропорциях
Я хочу отметить, что единственный вывод, который можно сделать из этих цифр, состоит в том, что с точки зрения производительности, очень мало чего можно добиться, выбрав один из этих методов над другим . Разница в одном вызове очень мала (где очень мало стремится к нулю). Тем не менее, "как" быстрее:)
После этого приведенные выше цифры в основном соответствуют разуму.
«Как» занимает больше времени при неудаче, чем при успехе. В случае успеха ничего не происходит, значение можно использовать как есть или просто скопировать. В случае неудачи требуется переход для копирования нулевой ссылки.
«Приведение» происходит быстрее при сбое, один вызов «есть» и больше не работает. В случае успеха это намного медленнее, у него есть перевес вызова «есть», а затем приведение.
Однако я удивлен, что приведение при сбое занимает больше времени, чем сбой AS
Редактировать
По запросу цифры для броска в блоке try / catch
Over 100000000 iterations
Catch : Failure 05.05:00:00 // approximately, because I didn't hang around
Catch : Success 00:00:01.4000952
Код, который произвел первый набор цифр
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++;
}
}