আমি দেখতে চেয়েছিলাম যে এই প্রস্তাবিত সমাধানগুলির মধ্যে কোনটি সর্বোত্তমভাবে সম্পাদিত হয়েছিল, তাই আমি কিছু তুলনামূলক পরীক্ষা চালিয়েছি। আগ্রহের বাইরে, আমি লিনকিউ পদ্ধতিগুলি গ্রেগের প্রস্তাবিত প্লেইন পুরাতন System.XML পদ্ধতির সাথেও তুলনা করি । তারতম্যটি আকর্ষণীয় ছিল এবং আমার প্রত্যাশা মতো নয়, ধীরতম পদ্ধতিগুলি দ্রুততমের চেয়ে 3 গুণ বেশি ধীর হয় ।
সবচেয়ে দ্রুততম দ্বারা অর্ডার করা ফলাফলগুলি:
- ক্রিয়েটরিডার - ইনস্ট্যান্স হান্টার (0.113 সেকেন্ড)
- সরল পুরানো সিস্টেম.এক্সএমএল - গ্রেগ হারলম্যান (0.134 সেকেন্ড)
- স্ট্রিং কনটেনটেশনের সাথে সমষ্টি - মাইক পাওয়েল (0.324 সেকেন্ড)
- স্ট্রিংবিল্ডার - ভিন (০.৩৩৩ সেকেন্ড)
- স্ট্রিং.আরনে যোগ দিন - টেরি (0.360 সেকেন্ড)
- অ্যারেতে স্ট্রিং.কনকাট - মার্সিন কোসিরাডজকি (0.364)
পদ্ধতি
আমি 20 টি অভিন্ন নোড সহ একটি একক এক্সএমএল নথি ব্যবহার করেছি (যাকে 'ইঙ্গিত' বলা হয়):
<hint>
<strong>Thinking of using a fake address?</strong>
<br />
Please don't. If we can't verify your address we might just
have to reject your application.
</hint>
উপরের সেকেন্ড হিসাবে প্রদর্শিত সংখ্যাগুলি হ'ল 20 টি নোডের "অভ্যন্তরীণ এক্সএমএল" টানা, একাধারে একাধিক বার এবং 5 রানের গড় (গড়) নেওয়ার ফলাফল। এক্সএমএলটিকে XmlDocument
( সিস্টেম.এক্সএমএল পদ্ধতির জন্য) বা XDocument
(অন্য সকলের জন্য ) মধ্যে এক্সএমএল লোড করার এবং পার্স করার সময়টি আমি অন্তর্ভুক্ত করিনি ।
আমি যে লিনিকিউ অ্যালগরিদম ব্যবহার করেছি সেগুলি হ'ল: (সি # - সবাই একটি XElement
"পিতামাতা" নেয় এবং অভ্যন্তরীণ এক্সএমএল স্ট্রিংটি ফেরত দেয়)
CreateReader:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
স্ট্রিং কনটেন্টেশন সহ সমষ্টি:
return parent.Nodes().Aggregate("", (b, node) => b += node.ToString());
StringBuilder:
StringBuilder sb = new StringBuilder();
foreach(var node in parent.Nodes()) {
sb.Append(node.ToString());
}
return sb.ToString();
স্ট্রিং.আরনে যোগ দিন:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
স্ট্রিং.আরকে কনক্যাট:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
আমি এখানে "সরল পুরাতন সিস্টেম। এক্সএমএল" অ্যালগরিদম দেখাইনি কারণ এটি কেবল কল করছে।
উপসংহার
যদি পারফরম্যান্স গুরুত্বপূর্ণ হয় (যেমন প্রচুর এক্সএমএল, প্রায়শই পার্স করা হয়) তবে আমি প্রতিবার ড্যানিয়েলের পদ্ধতিটি ব্যবহার করবCreateReader
। আপনি যদি কেবল কয়েকটি প্রশ্ন করছেন তবে আপনি মাইকের আরও সংক্ষিপ্ত সমষ্টি পদ্ধতিটি ব্যবহার করতে চাইতে পারেন।
যদি আপনি প্রচুর নোড (সম্ভবত 100 এর) সাথে বড় উপাদানগুলিতে এক্সএমএল ব্যবহার করেন তবে আপনি সম্ভবত StringBuilder
সমষ্টি পদ্ধতি ব্যবহার করে সুবিধাটি দেখতে শুরু করেছেন তবে শেষ হয়নি CreateReader
। আমি মনে করি না যে একটি বৃহত তালিকাকে একটি বড় অ্যারেতে রূপান্তর করার শাস্তির কারণে (এমনকি ছোট তালিকা সহ এটিও সুস্পষ্ট) কারণগুলি Join
এবং Concat
পদ্ধতিগুলি এই পরিস্থিতিতে আরও কার্যকর হবে।