یادداشتهای یک برنامه نویس

بیان تجربیات و دیدگاه های یک برنامه نویس در مورد نرم افزار , طراحی و تولید برنامه با استفاده از تکنولوژی های مایکروسافت

یادداشتهای یک برنامه نویس

بیان تجربیات و دیدگاه های یک برنامه نویس در مورد نرم افزار , طراحی و تولید برنامه با استفاده از تکنولوژی های مایکروسافت

يكشنبه, ۱۱ اسفند ۱۳۹۲، ۰۵:۵۶ ب.ظ

استفاده یا عدم استفاده از Generic


     در این برنامه ابتدا یک کلاس بسیار ساده برای بررسی نحوه انجام پاکسازی حافظه و به دست آوردن معیار مناسبی جهت اندازه گیری میزان کارآیی استفاده از تکنیک Generic ایجاد شده است.
بررسی نتایج حاصل از این برنامه نشان میدهد که استفاده از Generic بویژه در انواع ValueType از نظر مصرف منابع، بسیار مقرون به صرفه تر بوده و سرعت انجام عملیات به مراتب بالاتر خواهد بود. در انواع Reference Type نیز این افزایش کارآیی وجود دارد اما به اندازه مورد قبلی محسوس نیست. خروجی برنامه ، زمان صرف شده برای درج 10 میلیون عنصر از یک نوع Value Type (در مثال ما این نوع int انتخاب شده است) به ترتیب با استفاده از Generic و بدون آن ، و همچنین همین عملیات مشابه برای یک نوع Reference Type (در مثال این نوع string انتخاب شده است) را با استفاده از کلاس StopWatch و تعداد تلاشهای CLR برای پاکسازی (Garbage Collector) با استفاده از متد استاتیک کلاس GC، در طول این پروسه ، نشان داده شده است. با تغییر در مقدار Max_Loop_Count ، مثلا بیشتر کردن آن امکان بروز Out Of Memory Exception وجود دارد و به دلیل سادگی و خلاصه بودن کد، در برنامه تمهیداتی برای کنترل آن در نظر گرفته نشده است.
 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace GenericOrNotGeneric
{

class Program
{

const Int32 Max_Loop_Count = 10000000;
static void Main(string[] args)
{

ValueTypePerformanceTest();
ReferenceTypePerformanceTest();
Console.WriteLine("Now in the end you decide. ");
Console.WriteLine("Please press <Enter> to exit...");
Console.ReadLine();
}

private static void ValueTypePerformanceTest()
{

using (new OperationTimer("List<Int32>"))
{
List<Int32> l = new List<Int32>();
for (Int32 n = 0; n < Max_Loop_Count; n++)
{
l.Add(n);
Int32 x = l[n];
}
l = null;
}
using (new OperationTimer("ArrayList of Int32"))
{
ArrayList a = new ArrayList();
for (Int32 n = 0; n < Max_Loop_Count; n++)
{
a.Add(n);
Int32 x = (Int32)a[n];
}
a = null;
}
}
private static void ReferenceTypePerformanceTest()
{

using (new OperationTimer("List<String>"))
{
List<String> l = new List<String>();
for (Int32 n = 0; n < Max_Loop_Count; n++)
{
l.Add("X");
String x = l[n];
}
l = null;
}
using (new OperationTimer("ArrayList of String"))
{
ArrayList a = new ArrayList();
for (Int32 n = 0; n < Max_Loop_Count; n++)
{
a.Add("X");
String x = (String)a[n];
}
a = null;
}
}
}

internal sealed class OperationTimer : IDisposable
{
private Stopwatch m_stopwatch;
private String m_text;
private Int32 m_collectionCount;
public OperationTimer(String text)
{
PrepareForOperation();
m_text = text;
m_collectionCount = GC.CollectionCount(0);
m_stopwatch = Stopwatch.StartNew();
}
public void Dispose()
{
Console.WriteLine("{0} (GCs={1,3}) {2}", (m_stopwatch.Elapsed),
GC.CollectionCount(0) - m_collectionCount, m_text);
}
private static void PrepareForOperation()
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
}
}

 

موافقین ۰ مخالفین ۰ ۹۲/۱۲/۱۱

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی