<strike id="kouok"></strike>
  • <abbr id="kouok"></abbr>
    <ul id="kouok"></ul>
    • <ul id="kouok"></ul>

      南京軟件定制開發

      南京傾心軟件歡迎您訪問本站

      13605185909

      新聞資訊

      NEWS CENTER
      欄目導航

      企業定制軟件之C#與C++混合編程及性能分析

      發布時間:Mar 01, 2022         已有 人瀏覽
      C#C++混合編程及性能分析
      概要:
      眾所周知, ?
      C#做界??C++開發效率要?得多, 但在有性能問題的情況下不得不將部分模塊使?C++, 這時就需要使?C#C++混合
      編程。 本?給出了兩種混合編程的?法以及性能對?。
      開發環境:

      ThinkPad T430 i5-3230M 2.6G 8GWin7 64BitVS2013C++開發設置) , C++C#都采?x64平臺, 性能驗證使?Release版本。
      測試純
      C++項?性能:
      1. 新建空解決?案: ?件|新建|項?|已安裝|模板|其他項?類型|Visual Studio解決?案|空?解決?案
      2. 新建PureCpp項?: 右擊解決?案|添加|新建項?|已安裝|Visual C++|Win32控制臺程序, 按缺省設置?成項?
      3. 在配置管理器中新建x64平臺, 刪除其他平臺
      4. 新建CppFunction, 并添加測試代碼, 完整代碼如下, 程序結果: Result: 1733793664 Elapsed: 109
      // CppFunction.h
      #pragma once
      class CppFunction
      {
      p
      ublic
      :
      CppFunction(){}
      ~CppFunction(){}

      int TestFunc(int a, int b);
      };

      // CppFunction.cpp
      #include "stdafx.h"
      #include "CppFunction.h"
      class CCalc
      {
      p
      ublic
      :
      CCalc(
      int a, int b)
      {
      m_a = a;
      m_b = b;
      }
      i
      nt
      Calc()
      {

      if (m_a % 2 == 0){
      return m_a + m_b;
      }
      if
      (m_b % 2 == 0){
      return m_a - m_b;
      }
      r
      eturn
      m_b - m_a;
      }

      private:
      int m_a;
      int m_b;
      };

      int CppFunction::TestFunc(int a, int b)
      {
      CCalc calc(a, b);

      return calc.Calc();
      }
      /
      / PureCpp.cpp :
      定義控制臺應?程序的??點。
      //
      #include "stdafx.h"
      #include <iostream>
      #include <windows.h>
      #include
      "CppFunction.h"
      using namespace std;
      int _tmain(int argc, _TCHAR* argv[])
      {
      DWORD start = ::GetTickCount();
      CppFunction cppFunction;

      int result = 0;
      for (int i = 0; i < 10000; i++){
      for (int j = 0; j < 10000; j++){
      result += cppFunction.TestFunc(i, j);
      }
      }D
      WORD end = ::GetTickCount();
      cout <<
      "Result: " << result << " Elapsed: " << end - start << endl;
      return 0;
      }
      V
      iew Code

      測試純Csharp項?性能:
      1. 新建PureCsharp項?: 右擊解決?案|添加|新建項?|已安裝|其他語?|Visual C#|控制臺應?程序, 按缺省設置?成項?
      2. 在配置管理器中新建x64平臺, 刪除其他平臺, 去掉【創建新的解決?案平臺】 勾選, 否則會報x64平臺已經存在
      3. C++項?中的代碼復制過來稍作改動, 完整代碼如下, 程序結果: Result: 1733793664 Elapsed: 729
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      namespace PureCsharp
      {

      class CCalc
      {

      public CCalc(int a, int b)
      {
      m_a = a;
      m_b = b;
      }
      p
      ublic int
      Calc()
      {

      if (m_a % 2 == 0)
      {

      return m_a + m_b;
      }
      if
      (m_b % 2 == 0)
      {

      return m_a - m_b;
      }
      r
      eturn
      m_b - m_a;
      }
      p
      rivate int
      m_a;
      private int m_b;
      }
      c
      lass
      CppFunction
      {

      public int TestFunc(int a, int b)
      {
      CCalc calc =
      new CCalc(a, b);
      return calc.Calc();
      }
      }
      c
      lass
      Program
      {

      static void Main(string[] args)
      {
      DateTime start = System.DateTime.Now;
      CppFunction cppFunction =
      new CppFunction();
      int result = 0;
      for (int i = 0; i < 10000; i++){
      for (int j = 0; j < 10000; j++){
      result += cppFunction.TestFunc(i, j);
      }
      }D
      ateTime end = System.DateTime.Now;

      System.Console.WriteLine("Result: " + result + " Elapsed: " + (end - start).Milliseconds);
      }
      }
      }
      V
      iew Code

      性能分析:
      從上?的對?可以看出, 同樣的功能,
      C#的耗時?乎是C++7倍, 這個例??的主要原因是, C++可以使??效的棧內存對象
      CCalc) , ?C#所有對象只能放在托管堆中。
      托管
      C++混合?式:
      1. 新建C#控制臺項?, 命名為BenchCsharp, 使?它來調?C++項?, 修改?成?錄為: ..\x64\Release\
      2.
      新建C++DLL項?, 命名為DLLCpp, 選擇空項?, ?成成功, 但由于是空項?, 不會真正?成dll?件
      3. DLLCpp為空項?時, 在BenchCsharp中可以成功添加引?, 但當DLLCpp中添加類后, 就不能成功添加引?了, 已經添加的引?
      也會顯?警告

      4. 修改DLLCpp項?屬性, 右擊項?|屬性|配置屬性|常規|公共語?運?時?持, 修改后就可以成功引?了
      5. DLLCpp中添加CppFunction類, 并復制代碼, 完整代碼如下, 程序結果: Result: 1733793664 Elapsed: 405
      // CppFunction.h
      #pragma once
      public ref class CppFunction
      {
      p
      ublic
      :
      CppFunction(){}
      ~CppFunction(){}

      int TestFunc(int a, int b);
      };

      // CppFunction.cpp
      #include "CppFunction.h"
      class CCalc
      {
      p
      ublic
      :
      CCalc(
      int a, int b)
      {
      m_a = a;
      m_b = b;
      }
      i
      nt
      Calc()
      {

      if (m_a % 2 == 0){
      return m_a + m_b;
      }
      if
      (m_b % 2 == 0){
      return m_a - m_b;
      }
      r
      eturn
      m_b - m_a;
      }

      private:
      int m_a;
      int m_b;
      };

      int CppFunction::TestFunc(int a, int b)
      {
      CCalc calc(a, b);

      return calc.Calc();
      }
      V
      iew Code

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      namespace BenchCsharp
      {

      class Program
      {

      static void Main(string[] args)
      {
      DateTime start = System.DateTime.Now;
      CppFunction cppFunction =
      new CppFunction();
      int result = 0;
      for (int i = 0; i < 10000; i++)
      {

      for (int j = 0; j < 10000; j++)
      {
      result += cppFunction.TestFunc(i, j);
      }
      }D
      ateTime end = System.DateTime.Now;
      System.Console.WriteLine(
      "Result: " + result + " Elapsed: " + (end - start).Milliseconds);
      }
      }
      }
      V
      iew Code

      性能分析:
      使?混合編程后, 性能得到了?定程度的提升, 但?起單純的
      C++項?, 還是差了很多
      C#主函數中的邏輯轉移到DLLCpp項?中, 即添加如下的static?法, C#中只要調?該?法, 程序結果: Result: 1733793664
      Elapsed: 405

      int CppFunction::Test()
      {
      DWORD start = ::GetTickCount();
      CppFunction cppFunction;

      int result = 0;
      for (int i = 0; i < 10000; i++){
      for (int j = 0; j < 10000; j++){
      result += cppFunction.TestFunc(i, j);
      }
      }D
      WORD end = ::GetTickCount();
      cout <<
      "Result: " << result << " Elapsed: " << end - start << endl;
      return result;
      }
      V
      iew Code

      并沒有變得更快, 估計是當使?【公共語?運?時?持】 ?式編譯C++時, 不能發揮C++的性能優勢
      DLLImport混合?式:
      1. 新建?空的C++DLL項?, 命名為NativeDLLCpp
      2.
      CppFunction類從PureCpp中復制過來
      3. 代碼如下, 運?結果: Result: 1733793664 Elapsed: 125
      // NativeDLLCpp.cpp : 定義 DLL 應?程序的導出函數。
      //
      #include "stdafx.h"
      #include <iostream>
      #include <windows.h>
      #include
      "CppFunction.h"
      using namespace std;
      #ifdef __cplusplus

      #define TEXPORT extern "C" _declspec(dllexport)
      #else
      #define
      TEXPORT _declspec(dllexport)
      #endif
      TEXPORT int Test()
      {

      DWORD start = ::GetTickCount();
      CppFunction cppFunction;

      int result = 0;
      for (int i = 0; i < 10000; i++){
      for (int j = 0; j < 10000; j++){
      result += cppFunction.TestFunc(i, j);
      }
      }D
      WORD end = ::GetTickCount();
      cout <<
      "Result: " << result << " Elapsed: " << end - start << endl;
      return result;
      }
      V
      iew Code

      public class NativeDLLCpp
      {
      [DllImport(
      "NativeDLLCpp.dll")]
      public static extern int Test();
      }
      c
      lass
      Program
      {

      static void Main(string[] args)
      {
      DateTime start = System.DateTime.Now;

      int result = NativeDLLCpp.Test();
      DateTime end = System.DateTime.Now;
      System.Console.WriteLine(
      "Result: " + result + " Elapsed: " + (end - start).Milliseconds);
      }
      }

      View Code
      性能分析:
      跟純
      C++項?性能?乎?致。
      項?依賴項需要?動設置。
      實現聯調的?法: 修改
      C#項?屬性|調試|啟?本機代碼調試

      Copyright © 2020-2022 南京傾心軟件技術有限公司 版權所有     蘇ICP備2020070309號-1
      QQ在線咨詢
      13605185909
      返回頂部
      主站蜘蛛池模板: 亚洲精品午夜无码专区| 久久精品无码一区二区日韩AV| 久久99精品国产麻豆宅宅| 麻豆精品| 四虎最新永久在线精品免费 | 人妻精品久久久久中文字幕一冢本 | 亚洲午夜成人精品电影在线观看| 2021年精品国产福利在线| 国产精品国产三级国产av品爱网| 亚洲精品美女久久久久99小说| 国产精品亚洲视频| 热99re久久国超精品首页| 99久久精品日本一区二区免费| 亚洲国产精品无码专区在线观看| 国産精品久久久久久久| 99国产精品私拍pans大尺度 | 久久精品国产亚洲AV无码娇色 | 日本五区在线不卡精品| 国产在线精品一区二区夜色 | 国产精品视频免费观看| 国产成人精品2021| 国产精品第12页| japanese乱人伦精品| 国产午夜精品久久久久免费视| 亚洲∧v久久久无码精品| 亚洲欧洲久久久精品| 无码人妻精品一区二区蜜桃百度| 青春草无码精品视频在线观| 久久久精品久久久久久| 精品伦精品一区二区三区视频| 国产精品爱搞视频网站| 国产成人亚洲精品影院| 9999国产精品欧美久久久久久 | 奇米精品一区二区三区在线观看| 精品日产一区二区三区手机| 久久99久久99小草精品免视看| 国产精品91av| 四虎影视884a精品国产四虎| 亚洲精品无码不卡| 91精品日韩人妻无码久久不卡| 大胸国产精品视频|