三種方式實例化一個類的性能情況

来源:http://www.cnblogs.com/zwt-blog/archive/2016/06/12/5576793.html
-Advertisement-
Play Games

源內容:http://www.cnblogs.com/shouce/p/5558095.html#undefined 下麵的內容是根據“源內容”進行了整改、補充。 三種方式實例化一類,包括無參數構造形式與有參數構造形式性能測試。 測試環境: 1) Visual studio 2015 Communi ...


源內容:http://www.cnblogs.com/shouce/p/5558095.html#undefined

下麵的內容是根據“源內容”進行了整改、補充。

三種方式實例化一類,包括無參數構造形式與有參數構造形式性能測試

  1. 使用new關鍵字創建類實例(常用方式)。
  2. 使用Activator激活器類創建類實例(Activator用以在本地或從遠程創建對象類型,或獲取對現有遠程對象的引用)。
  3. 使用Assembly程式集創建類實例(Assembly表示一個程式集,它是一個可重用、無版本衝突並且可自我描述的公共語言運行庫應用程式構造塊。該類可以載入程式集、瀏覽程式集的元數據和構成部分、發現程式集中包含的類型以及創建這些類型的實例)。

測試環境:

  1) Visual studio 2015 Community

  2) Windows 10 Profession

  3) Memory 6G,CPU Inter-Core-i3-3220 @ 3.3GHz

測試代碼如下,分別為介面、介面實現類、實例化類的創建、執行測試方法

/// <summary>
/// 職業、行業
/// </summary>
public interface IProfession
{
    string Name { get; }
    string MostMeaningThing();
}
/// <summary>
/// 工人、藍領
/// </summary>
public class Worker : IProfession
{
    public Worker(string name)
    {
        Name = name;
    }

    public Worker()
    {
        
    }

    public string Name { get; private set; }

    public string MostMeaningThing()
    {
        return "挖掘機哪家強山東找藍翔";
    }
} 
public class InstanceClass
{
    //可根據自己的項目名稱進行修改
    private string className = "TestProblem.Worker";
    //執行次數
    private int time = 100000;
    /// <summary>
    /// 是否執行有參數構造函數
    /// </summary>
    private bool hasParameters;

    public InstanceClass(bool hasParameters)
    {
        this.hasParameters = hasParameters;
    }

    /// <summary>
    /// 通過new關鍵字創建
    /// </summary>
    public void CreateByNew()
    {
        IProfession profession;
        Stopwatch watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < time; i++)
        {
            profession = hasParameters ? new Worker("工人-New-" + i) : new Worker();
        }
        watch.Stop();
        Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));

    }
    /// <summary>
    /// 通過Activator控制類創建
    /// </summary>
    public void CreateByActivator()
    {
        Type type = Type.GetType(className);
        IProfession profession;
        Stopwatch watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < time; i++)
        {
            object obj = hasParameters ? Activator.CreateInstance(type, "工人-Activator-" + i) : Activator.CreateInstance(type);
            profession = obj as IProfession;
        }
        watch.Stop();
        Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
    }
    /// <summary>
    /// 通過Assembly控制類創建
    /// </summary>
    public void CreateByAssembly()
    {
        Assembly assembly = Assembly.GetAssembly(Type.GetType(className));
        IProfession profession;
        Stopwatch watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < time; i++)
        {
            object obj = hasParameters ?
                assembly.CreateInstance(className, true, BindingFlags.Default, null, new object[] { "工人-Assembly-" + i }, CultureInfo.CurrentCulture, null)
                : assembly.CreateInstance(className);
            profession = obj as IProfession;
        }
        watch.Stop();
        Console.Write(watch.ElapsedMilliseconds.ToString().PadLeft(5));
    }
    /// <summary>
    /// For迴圈,替代代碼中多次手寫類似的For迴圈代碼
    /// </summary>
    /// <param name="time">迴圈次數</param>
    /// <param name="action">委托</param>
    public static void ForLoop(int time, Action<int> action)
    {
        for (int i = 0; i < time; i++)
        {
            action(i);
        }
    }
    /// <summary>
    /// For迴圈,封裝For迴圈代碼執行
    /// </summary>
    /// <param name="time">迴圈次數</param>
    /// <param name="action">委托,函數指針</param>
    public static void ForLoop(int time, Action action)
    {
        for (int i = 0; i < time; i++)
        {
            action();
        }
    }
}
/// <summary>
/// 執行十次的十萬個創建類實例
/// </summary>
private static void ExecuteLakh()
{
    bool hasParameters = true;
    Console.WriteLine("實例化一個類({0}參數構造)的性能比較(單位:毫秒)", hasParameters ? "" : "");
    Console.Write("\t\t\t");
    InstanceClass.ForLoop(10, i => Console.Write("{0:G}", (i + 1).ToString().PadLeft(5)));
    Console.WriteLine();
    InstanceClass instanceClass = new InstanceClass(hasParameters);
    Console.Write("CreateByNew".PadRight(24));
    InstanceClass.ForLoop(10, () => instanceClass.CreateByNew());
    Console.WriteLine();
    Console.Write("CreateByActivator".PadRight(24));
    InstanceClass.ForLoop(10, () => instanceClass.CreateByActivator());
    Console.WriteLine();
    Console.Write("CreateByAssembly".PadRight(24));
    InstanceClass.ForLoop(10, () => instanceClass.CreateByAssembly());
    Console.WriteLine();
}

測試結果如下:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前一陣子在公司移植Linux2.6到一塊ARM11的開發板上,下麵粗略講講移植Linux的一般過程。 一開始的UBOOT的移植不多說了。UBOOT最後有兩種方式進入Linux,一種是使用uImage,可以在引導時附加命令行參數,但操作起來比較麻煩。另一種較簡單的是使用tftp將Linux內核載入到0 ...
  • 一,Samba伺服器安裝(通過yum來進行安裝) 1.通過yum來進行Samba伺服器,註意,如果通過yum方式來下載軟體,格式都是rpm的格式 在等待了一會後,可以看到如下界面(通過yum方式安裝時,有依賴關係的包samba-common、samba-winbind-clients、libsmbc ...
  • Linux中如何使用gThumb批量調整圖片大小 Linux中如何使用gThumb批量調整圖片大小 Linux中如何使用gThumb批量調整圖片大小 導讀 如果你的工作涉及到圖片編輯和處理,就一定會有同時對多張圖片進行批量大小調整的經歷。雖然大多數圖片編輯應用都能夠非常容易地批量調整多張圖片,但對於 ...
  • DOS 和 Linux 常用命令的對比 許多在 shell 提示下鍵入的 Linux 命令都與你在 DOS 下鍵入的命令相似。事實上,某些命令完全相同。 本附錄提供了 Windows 的 DOS 提示下的常用命令以及在 Linux 中與它們等同的命令。附錄中還提供瞭如何在 Linux shell 提 ...
  • 1) 重啟後生效 開啟: chkconfig iptables on 關閉: chkconfig iptables off 2) 即時生效,重啟後失效 開啟: service iptables start 關閉: service iptables stop 需要說明的是對於Linux下的其它服務都可 ...
  • linux系統中通過chmod來修改文件和目錄許可權,其中要非常註意文件和目錄許可權各自的含義和差別。 ...
  • 所有可能的設置:新建一個文件夾,將它命名為“some_name.{ED7BA470-8E54-465E-825C-99712043E01C}”,打開就是這臺電腦的所有設置視窗【所有的設置視窗都在桌面的文件夾里】 雙擊鎖住電腦:在桌面上新建一個快捷方式,在鍵入項目的地址上輸入“rundll32.exe ...
  • Let's Encrypt是一個免費SSL證書發行項目,發行的證書已經獲得主流瀏覽器的支持,親測谷歌瀏覽器(桌面版)、火狐瀏覽器(桌面版)、UC瀏覽器(手機版)、360瀏覽器(手機版)支持,其它的暫沒測試; 本文講解如何使用Let's Encrypt獲得免費SSL證書,配置apache的SSL功能, ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...