আমি মাত্র গভীরতার সি # এর চতুর্থ অধ্যায়টি সংশোধন করছি যা অবনমিত প্রকারগুলি নিয়ে কাজ করে এবং আমি "হিসাবে" অপারেটরটি ব্যবহার সম্পর্কে একটি বিভাগ যুক্ত করছি যা আপনাকে লেখার অনুমতি দেয়:
object o = ...;
int? x = o as int?;
if (x.HasValue)
{
... // Use x.Value in here
}
আমি ভেবেছিলাম এটি সত্যই ঝরঝরে, এবং এটি সি # 1 সমমানের উপরের পারফরম্যান্সের উন্নতি করতে পারে, "একটি" অনুসরণ করে একটি নিক্ষিপ্ত হয় - সর্বোপরি, আমাদের কেবল একবার গতিশীল ধরণের চেকিং জিজ্ঞাসা করতে হবে, এবং তারপরে একটি সাধারণ মান চেক ।
তবে এটি ক্ষেত্রে হবে না বলে মনে হয়। আমি নীচে একটি নমুনা পরীক্ষা অ্যাপ্লিকেশন অন্তর্ভুক্ত করেছি, যা মূলত একটি অবজেক্ট অ্যারের মধ্যে সমস্ত পূর্ণসংখ্যার যোগফল করে - তবে অ্যারেতে প্রচুর নাল রেফারেন্স এবং স্ট্রিং রেফারেন্স পাশাপাশি বক্সযুক্ত পূর্ণসংখ্যা রয়েছে। মানদণ্ডটি আপনাকে সি # 1 তে যে কোডটি ব্যবহার করতে হবে তা পরিমাপ করে, "হিসাবে" অপারেটর ব্যবহার করে কোডটি, এবং কেবল একটি লিনকিউ সমাধানের জন্য। আমার বিস্ময়ের জন্য, সি # 1 কোডটি এই ক্ষেত্রে 20 গুণ বেশি দ্রুত - এবং এমনকি লিনকিউ কোড (যা আমি ধীরে ধীরে হওয়ার প্রত্যাশা করতাম, এটির পুনরাবৃত্তিকারীরা জড়িত হয়ে) "হিসাবে" কোডটি মারধর করে।
.NET বাস্তবায়নের ধরণের isinst
জন্য কি আসলেই ধীর হয়? এটি কি অতিরিক্ত unbox.any
কারণ সমস্যার সৃষ্টি করে? এর জন্য আর কোন ব্যাখ্যা আছে কি? এই মুহুর্তে মনে হচ্ছে আমি পারফরম্যান্স সংবেদনশীল পরিস্থিতিতে এটি ব্যবহার করার বিরুদ্ধে একটি সতর্কতা অন্তর্ভুক্ত করতে চাই ...
ফলাফল:
কাস্ট: 10000000: 121
হিসাবে: 10000000: 2211
লিনকুই: 10000000: 2143
কোড:
using System;
using System.Diagnostics;
using System.Linq;
class Test
{
const int Size = 30000000;
static void Main()
{
object[] values = new object[Size];
for (int i = 0; i < Size - 2; i += 3)
{
values[i] = null;
values[i+1] = "";
values[i+2] = 1;
}
FindSumWithCast(values);
FindSumWithAs(values);
FindSumWithLinq(values);
}
static void FindSumWithCast(object[] values)
{
Stopwatch sw = Stopwatch.StartNew();
int sum = 0;
foreach (object o in values)
{
if (o is int)
{
int x = (int) o;
sum += x;
}
}
sw.Stop();
Console.WriteLine("Cast: {0} : {1}", sum,
(long) sw.ElapsedMilliseconds);
}
static void FindSumWithAs(object[] values)
{
Stopwatch sw = Stopwatch.StartNew();
int sum = 0;
foreach (object o in values)
{
int? x = o as int?;
if (x.HasValue)
{
sum += x.Value;
}
}
sw.Stop();
Console.WriteLine("As: {0} : {1}", sum,
(long) sw.ElapsedMilliseconds);
}
static void FindSumWithLinq(object[] values)
{
Stopwatch sw = Stopwatch.StartNew();
int sum = values.OfType<int>().Sum();
sw.Stop();
Console.WriteLine("LINQ: {0} : {1}", sum,
(long) sw.ElapsedMilliseconds);
}
}
as
nallable প্রকারের উপর ব্যবহার করতে পারেন । আকর্ষণীয়, কারণ এটি অন্যান্য মানের ধরণের ক্ষেত্রে ব্যবহার করা যায় না। আসলে, আরও অবাক করা।
as
কোনও প্রকারে কাস্ট করার চেষ্টা করুন এবং যদি এটি ব্যর্থ হয় তবে তা বাতিল হয়ে যায়। আপনি মূল্য প্রকারগুলি বাতিল করতে পারবেন না