এটি @ সার্জি এবং @ স্টিফেনের উত্তরগুলিতে আরও দীর্ঘ মন্তব্য। অতীতে নিজেও অনুরূপ কোড লিখেছি আমি স্বচ্ছতার বিষয়টি স্মরণে রাখার সময় সর্বাধিক পারফরম্যান্স কী তা যাচাই করার সিদ্ধান্ত নিয়েছি ।
ফলাফল
এখানে 10 মিলিয়ন পুনরাবৃত্তির জন্য পরীক্ষার রান ফলাফল রয়েছে:
2257 ms for FirstDayOfMonth_AddMethod()
2406 ms for FirstDayOfMonth_NewMethod()
6342 ms for LastDayOfMonth_AddMethod()
4037 ms for LastDayOfMonth_AddMethodWithDaysInMonth()
4160 ms for LastDayOfMonth_NewMethod()
4212 ms for LastDayOfMonth_NewMethodWithReuseOfExtMethod()
2491 ms for LastDayOfMonth_SpecialCase()
কোড
সংকলক অপ্টিমাইজেশন চালু করে পরীক্ষা চালানোর জন্য আমি লিনকিপ্যাড 4 (সি # প্রোগ্রাম মোডে) ব্যবহার করেছি । স্বচ্ছতা এবং সুবিধার জন্য এক্সটেনশন পদ্ধতি হিসাবে পরীক্ষিত কোডটি এখানে দেওয়া হয়েছে:
public static class DateTimeDayOfMonthExtensions
{
public static DateTime FirstDayOfMonth_AddMethod(this DateTime value)
{
return value.Date.AddDays(1 - value.Day);
}
public static DateTime FirstDayOfMonth_NewMethod(this DateTime value)
{
return new DateTime(value.Year, value.Month, 1);
}
public static DateTime LastDayOfMonth_AddMethod(this DateTime value)
{
return value.FirstDayOfMonth_AddMethod().AddMonths(1).AddDays(-1);
}
public static DateTime LastDayOfMonth_AddMethodWithDaysInMonth(this DateTime value)
{
return value.Date.AddDays(DateTime.DaysInMonth(value.Year, value.Month) - value.Day);
}
public static DateTime LastDayOfMonth_SpecialCase(this DateTime value)
{
return value.AddDays(DateTime.DaysInMonth(value.Year, value.Month) - 1);
}
public static int DaysInMonth(this DateTime value)
{
return DateTime.DaysInMonth(value.Year, value.Month);
}
public static DateTime LastDayOfMonth_NewMethod(this DateTime value)
{
return new DateTime(value.Year, value.Month, DateTime.DaysInMonth(value.Year, value.Month));
}
public static DateTime LastDayOfMonth_NewMethodWithReuseOfExtMethod(this DateTime value)
{
return new DateTime(value.Year, value.Month, value.DaysInMonth());
}
}
void Main()
{
Random rnd = new Random();
DateTime[] sampleData = new DateTime[10000000];
for(int i = 0; i < sampleData.Length; i++) {
sampleData[i] = new DateTime(1970, 1, 1).AddDays(rnd.Next(0, 365 * 50));
}
GC.Collect();
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
for(int i = 0; i < sampleData.Length; i++) {
DateTime test = sampleData[i].FirstDayOfMonth_AddMethod();
}
string.Format("{0} ms for FirstDayOfMonth_AddMethod()", sw.ElapsedMilliseconds).Dump();
GC.Collect();
sw.Restart();
for(int i = 0; i < sampleData.Length; i++) {
DateTime test = sampleData[i].FirstDayOfMonth_NewMethod();
}
string.Format("{0} ms for FirstDayOfMonth_NewMethod()", sw.ElapsedMilliseconds).Dump();
GC.Collect();
sw.Restart();
for(int i = 0; i < sampleData.Length; i++) {
DateTime test = sampleData[i].LastDayOfMonth_AddMethod();
}
string.Format("{0} ms for LastDayOfMonth_AddMethod()", sw.ElapsedMilliseconds).Dump();
GC.Collect();
sw.Restart();
for(int i = 0; i < sampleData.Length; i++) {
DateTime test = sampleData[i].LastDayOfMonth_AddMethodWithDaysInMonth();
}
string.Format("{0} ms for LastDayOfMonth_AddMethodWithDaysInMonth()", sw.ElapsedMilliseconds).Dump();
GC.Collect();
sw.Restart();
for(int i = 0; i < sampleData.Length; i++) {
DateTime test = sampleData[i].LastDayOfMonth_NewMethod();
}
string.Format("{0} ms for LastDayOfMonth_NewMethod()", sw.ElapsedMilliseconds).Dump();
GC.Collect();
sw.Restart();
for(int i = 0; i < sampleData.Length; i++) {
DateTime test = sampleData[i].LastDayOfMonth_NewMethodWithReuseOfExtMethod();
}
string.Format("{0} ms for LastDayOfMonth_NewMethodWithReuseOfExtMethod()", sw.ElapsedMilliseconds).Dump();
for(int i = 0; i < sampleData.Length; i++) {
sampleData[i] = sampleData[i].FirstDayOfMonth_AddMethod();
}
GC.Collect();
sw.Restart();
for(int i = 0; i < sampleData.Length; i++) {
DateTime test = sampleData[i].LastDayOfMonth_SpecialCase();
}
string.Format("{0} ms for LastDayOfMonth_SpecialCase()", sw.ElapsedMilliseconds).Dump();
}
বিশ্লেষণ
আমি এর কয়েকটি ফলাফল দেখে অবাক হয়েছি।
যদিও এটিতে খুব FirstDayOfMonth_AddMethod
বেশি FirstDayOfMonth_NewMethod
কিছু নেই তবে পরীক্ষার বেশিরভাগ রানের তুলনায় কিছুটা দ্রুত ছিল । যাইহোক, আমি মনে করি যে পরবর্তীকালের কিছুটা স্পষ্ট অভিপ্রায় রয়েছে এবং তাই এর জন্য আমার একটি পছন্দ আছে।
LastDayOfMonth_AddMethod
এর বিরুদ্ধে ছিল স্পষ্ট ক্ষতিগ্রস্ত LastDayOfMonth_AddMethodWithDaysInMonth
, LastDayOfMonth_NewMethod
এবং LastDayOfMonth_NewMethodWithReuseOfExtMethod
। দ্রুততম তিনটির মধ্যে এর মধ্যে খুব বেশি কিছু নেই এবং তাই এটি আপনার ব্যক্তিগত পছন্দকে নেমে আসে। আমি LastDayOfMonth_NewMethodWithReuseOfExtMethod
এর অন্য কার্যকর এক্সটেনশন পদ্ধতির পুনরায় ব্যবহারের সাথে এর স্পষ্টতা বেছে নিয়েছি । আইএমএইচও এর উদ্দেশ্যটি আরও পরিষ্কার এবং আমি স্বল্প পারফরম্যান্স ব্যয় গ্রহণ করতে রাজি আছি।
LastDayOfMonth_SpecialCase
ধরে নিই যে আপনি বিশেষের ক্ষেত্রে মাসের প্রথম প্রদান করছেন যেখানে আপনি ইতিমধ্যে সেই তারিখটি গণনা করেছেন DateTime.DaysInMonth
এবং ফলাফল পেতে এটি অ্যাড পদ্ধতি ব্যবহার করে । এটি অন্যান্য সংস্করণগুলির চেয়ে দ্রুত, যেমনটি আপনি প্রত্যাশা করতেন, তবে আপনি যদি গতির জন্য মরিয়া না হন তবে আমি আপনার অস্ত্রাগারে এই বিশেষ কেসটির বিন্দুটি দেখতে পাচ্ছি না।
উপসংহার
আমার পছন্দগুলি সহ এবং স্টেফেনের সাথে আমি সাধারণভাবে চুক্তিতে এটি একটি এক্সটেনশন পদ্ধতির শ্রেণি রয়েছে:
public static class DateTimeDayOfMonthExtensions
{
public static DateTime FirstDayOfMonth(this DateTime value)
{
return new DateTime(value.Year, value.Month, 1);
}
public static int DaysInMonth(this DateTime value)
{
return DateTime.DaysInMonth(value.Year, value.Month);
}
public static DateTime LastDayOfMonth(this DateTime value)
{
return new DateTime(value.Year, value.Month, value.DaysInMonth());
}
}
আপনি যদি এ পর্যন্ত পেয়ে থাকেন তবে সময়ের জন্য আপনাকে ধন্যবাদ! এটি মজা হয়েছে: ¬)। এই অ্যালগোরিদমগুলির জন্য আপনার কাছে অন্য কোনও পরামর্শ থাকলে দয়া করে মন্তব্য করুন।
_Date
ভেরিয়েবলে একক মান সঞ্চিত আছে । আপনি যে মানটি থেকে কী পেতে চান?