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

来源: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...