मुझे दिलचस्पी थी कि LINQ का उपयोग करके मेरी कक्षाओं को सॉर्ट करना या आईसीओपरपेरबल इंटरफ़ेस और List.Sort को कार्यान्वित करना बेहतर होगा या नहीं। जब मैं LINQ कोड तेज था तो मैं काफी आश्चर्यचकित था।सूची क्यों है <> ऑर्डरब्य LINQ IComparable + सूची <> से बेहतर है। डीबग मोड में सॉर्ट करें?
परीक्षण करने के लिए, मैंने टेस्टसोर्ट के अपरिपक्व नाम के साथ एक बहुत ही सरल वर्ग बनाया, आईसीओपरपेबल लागू किया।
class TestSort: IComparable<TestSort> {
private int age;
private string givenName;
public int Age {
get {
return age;
}
set {
age = value;
}
}
public string GivenName {
get {
return givenName;
}
set {
givenName = value;
}
}
public TestSort(int age, string name) {
this.age = age;
this.givenName = name;
}
public int CompareTo(TestSort other) {
return this.age.CompareTo(other.age);
}
}
फिर एक साधारण प्रोग्राम यह कई बार सुलझाने के लिए - तरह ज्यादा सूची को कॉपी से ज्यादा महंगा था, इसलिए इस बात का प्रभाव पर ध्यान नहीं दिया जा सकता है।
class Program {
static void Main(string[] args) {
// Create the test data
string name = "Mr. Bob";
Random r = new Random();
var ts2 = new List<TestSort>();
for (int i = 0; i < 100; i++) {
ts2.Add(new TestSort(r.Next(), name));
}
DateTime start, end;
// Test List<>.Sort
start = DateTime.Now;
for (int i = 0; i < 100000; i++) {
var l = ts2.ToList();
l.Sort();
}
end = DateTime.Now;
Console.WriteLine("IComparable<T>: ");
Console.WriteLine((end - start).TotalMilliseconds);
// Test Linq OrderBy
start = DateTime.Now;
for (int i = 0; i < 100000; i++) {
var l = ts2.ToList();
l = l.OrderBy(item => item.Age).ToList();
}
end = DateTime.Now;
Console.WriteLine("\nLINQ: ");
Console.WriteLine((end - start).TotalMilliseconds);
Console.WriteLine("Finished.");
Console.ReadKey();
}
}
मैं काफी निम्नलिखित उत्पादन प्राप्त करने के लिए हैरान था:
IComparable<T>:
2965.1696
LINQ:
2181.1248
कभी कभी LINQ 2000 के नीचे जाना होगा, और कभी कभी IComparable के बारे में 3000
जाना जब मैं यह एक सामान्य के साथ परीक्षण किया जाएगा List<Int>
List.Sort
लाइनक की गति 1/4 थी, जो लगभग 2000 में बनी थी।
तो LINQ केवल ab क्यों है मेरी कक्षा के लिए सामान्य प्रकार की 66% गति? क्या मैं IComparable के कार्यान्वयन के साथ कुछ गलत कर रहा हूँ?
अद्यतन: मैं सिर्फ रिलीज़ मोड में यह कर की कोशिश करने के बारे में सोचा, और हाँ, परिणाम अलग अलग था:
IComparable<T>:
1593.0911
Linq:
1958.1119
लेकिन मैं अभी भी बहुत पता करने के लिए क्यों IComparable डिबग मोड में धीमी है दिलचस्पी ।
क्या आपने डीबग मोड (प्रोजेक्ट गुण) में ऑप्टिमाइज़ेशन सेट करने का प्रयास किया था और यह देखकर कि यह अभी भी धीमा है? यदि नहीं, तो यह समझा सकता है। – Gishu
अनुकूलन कोड चालू है ... और मैं एक योगदान कारक के बजाय एक वास्तविक कारण की तलाश में हूं। मैं समस्या को हल करने की कोशिश नहीं कर रहा हूं, दोनों विधियां मेरे उद्देश्यों के लिए पर्याप्त तेज़ हैं, मैं सिर्फ यह जानना चाहता हूं कि क्यों। –