<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
      返回頂部
      主站蜘蛛池模板: 国产99精品一区二区三区免费| 国产激情精品一区二区三区| 国产精品性爱| 亚洲国产精品无码久久久秋霞2 | 欧美精品一二区| 成人精品一区二区三区| 999精品在线| 综合国产精品第一页| 国产综合成人色产三级高清在线精品发布| 国内精品久久国产大陆| 麻豆成人久久精品二区三区免费 | 无码精品久久一区二区三区| 国产精品永久免费视频| 精品久久一区二区| 国内精品九九久久久精品| 亚洲av永久无码精品网站| 日本午夜精品理论片A级APP发布| 国产精品白丝AV嫩草影院| 久久亚洲国产精品一区二区 | 精品视频一区二区三三区四区| 综合精品欧美日韩国产在线| 亚洲精品456播放| 精品久人妻去按摩店被黑人按中出 | 国产色精品vr一区区三区| 成人精品一区二区久久久| 国产va免费精品| 国产成人精品久久综合 | 国产精品青草视频免费播放 | 亚洲精品久久久www | 国产精品无码一区二区三级| 日韩精品真人荷官无码| 亚洲国产精品成人精品无码区在线| 亚洲欧美日韩国产一区二区三区精品 | 久久久久久国产精品无码下载| 四虎国产精品永久地址99| 一本大道久久a久久精品综合| www夜片内射视频日韩精品成人| 国产精品视频免费一区二区| 黑巨人与欧美精品一区 | 久热精品视频第一页| 日韩精品视频在线观看免费 |