इस प्रश्न का पहले ही उत्तर दिया जा चुका है, हालांकि अब तक इसमें कठोर संख्याएं गायब हैं।
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" सफलता पर होने की तुलना में विफलता पर अधिक समय लेता है। सफलता पर कुछ नहीं होता है, मूल्य का उपयोग किया जा सकता है, या बस कॉपी किया जा सकता है। विफलता पर इसे एक शून्य संदर्भ की प्रतिलिपि बनाने के लिए एक कूद की आवश्यकता होती है।
"कास्ट" विफलता पर तेज़ है, एक कॉल "है" है और यह और नहीं करता है। सफलता पर यह बहुत धीमा है, इसमें कॉल का ओवर हेड "है" और फिर कास्ट है।
हालांकि मैं हैरान विफलता पर कास्ट विफलता के रूप में अधिक समय लेता है कि कर रहा हूँ
संपादित
अनुरोध किया के रूप में, एक आज़माएं/कैच ब्लॉक
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++;
}
}
उत्तर देख रहे हैं मुझे लगता है कि "है" सिर्फ यह जानना है कि कुछ वस्तु एक प्रकार है, और वे कुछ क्रियाएं करते हैं, न सिर्फ एक कलाकार। उदाहरण: यदि (ओबीजे क्लासमेनगर है) {लिखें ("आप एक प्रबंधक हैं")} –