本文分為兩方面
一.Native C++調用Native C++ DLL 並測試運行時間
二. 完全由C# 實現運算代碼 並測試運行時間
詳細過程:
一:
至於如何獲取EfficiencyNativeCPPDLL.dll 和 EfficiencyNativeCPPDLL.lib 以及生成項目EfficiencyNativeCPPDLL
本文講述在VS2010中本地C++調用C++類庫以進行效率測試
1. 常見Win32控制台應用程序 ConsoleCPPInvokeDLL
2.選擇下一步點擊完成就可以了
3 對EfficiencyNativeCPPDLL.lib的調用
在項目ConsoleCPPInvokeDLL中的資源文件上\右擊添加現有項可選擇 EfficiencyNativeCPPDLL.lib
4 書寫測試主體文件
CPPInvokeDLL.cpp #include "stdafx.h" #include "EfficiencyNativeCppDll.h" #include <time.h> #define NITER 201 int _tmain(int argc, _TCHAR* argv[]) { int i; clock_t start, stop; EfficiencyNativeCppDll* effPro = new EfficiencyNativeCppDll(); effPro->InitPositions(); effPro->UpdatePositions(); start=clock(); for( i=0; i<NITER; i++ ) { effPro->Pot = 0.0; /* //低效率模式 effPro->ComputePot(); if (i%10 == 0) printf("%5d: Potential: %10.3f\n", i, effPro->Pot); */ //高效率模式 ??不曉得為什麼這樣的速度會快那麼多 快了近20倍 if (i%10 == 0) printf("%5d: Potential: %10.3f\n", i, effPro->ComputePot()); effPro->UpdatePositions(); } stop=clock(); printf ("Seconds = %10.9f\n",(double)(stop-start)/ CLOCKS_PER_SEC); delete effPro; getchar(); }
測試結果:
二: C#代碼實現及測試結果:
EffCompute.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleEfficiencyCS { public class EffCompute { public double Pot{get;set;} private int DIMS = 3; private int NPARTS = 1000; private double[,] _r ; private Random _rand; public EffCompute() { _r = new double[DIMS, NPARTS]; _rand = new Random(); } public void InitPositions() { for(int i = 0; i < DIMS; i++) { for (int j = 0; j < NPARTS; j++) { _r[i, j] = 0.5 + _rand.NextDouble(); } } } public void UpdatePositions() { for (int i = 0; i < DIMS; i++) { for (int j = 0; j < NPARTS; j++) { _r[i, j] -= 0.5 + _rand.NextDouble(); } } } public double ComputePot() { double distx, disty, distz, dist; double pot; distx = 0; disty = 0; distz = 0; pot = 0; for (int i = 0; i < NPARTS; i++) { for (int j = 0; j < i - 1; j++) { distx = Math.Pow((_r[0, j] - _r[0, i]), 2); disty = Math.Pow((_r[1, j] - _r[1, i]), 2); distz = Math.Pow((_r[2, j] - _r[2, i]), 2); dist = Math.Sqrt(distx + disty + distz); pot += 1.0 / dist; } } this.Pot = pot; return pot; } } }
3 運算結果:
綜合以上兩篇文章可見 在均是Release情況下分別對
C#調用CLI/C++轉而調用 Native C++ Dll ;,本地C++調用 和 CS的.Net實現
可以看出
本地C++調用效率最高
C#調用CLI/C++轉而調用 Native C++ Dll的效率其次 可以說跟本地C++調用差不多
而CS的實現效率大約相差20倍.
作者:csdn博客 Cheviko