Pokaż ten swój benchmark. Akurat alokacja ma sporą szansę być szybsza w C#. Wywoływanie metod to w gruncie rzeczy będzie to samo.
Znalazłem coś, co testowałem kilka lat temu. Przy tych testach różnica dochodzi od 3 do prawie 4x na korzyść native. Trudno mi w tej chwili powiedzieć o tych 8-10 razach ale z pewnością jak robiłem podobne testy tak wychodziło. Z tego co pamiętam to robiłem jeszcze bardziej złożone przykłady. Przy czym te 10x to zapewne chodziło o c#.
Oczywiście zdaję sobie sprawę z tego, że różnica szybkości mocno jest uzależniona od zadania. Ale akurat w moim przypadku ogrom obliczeń przypada na tworzenie i zwalnianie obiektów oraz dostępie do ich metod. Zanim zabrałem się do pisania "przetrzepałem" sieć w poszukiwaniu podobnych opinii i rzeczywiście one były niejednoznaczne. Postanowiłem więc sam to sprawdzić i zrobić testy. Różnica dla moich zastosowań była porażająca dlatego zdecydowałem się na system łączony - jak chcę napisać łatwo i szybko to piszę w c#. Jak chcę bardzo szybkich obliczeń - przerzucam kod do native i dzięki "opakowywaniu" go za pomocą zarządzanego C++, z poziomu c# korzystam z tych obiektów bardzo wygodnie.
---------Kod zarządzany--------------
// SpeedTest_CppManaged.cpp : main project file.
#include "stdafx.h"
#include <iostream>
#include <tchar.h>
#include <windows.h>
using namespace System;
ref class cLine{
public:
float X1;
float X2;
};
ref class cShape{
public:
int a;
cLine Line;
};
int CreateObjects(int xVal){
cShape pShape;
pShape.Line.X1 = xVal;
pShape.Line.X2 = xVal * 2;
return pShape.Line.X1 + pShape.Line.X2 / xVal;
}
int main(array<System::String ^> ^args)
{
int pVal, pValA = 0;
int pStart, pEnd;
printf("%s\n", "Starting ...");
pStart = GetTickCount();
for (int i = 0; i < 1000000000; i++)
{
pValA += CreateObjects(i);
}
pEnd = GetTickCount();
pVal = pEnd - pStart;
printf("%d\n", pVal);
printf("%d\n", pValA);
printf("%s", "Press Enter to Continue");
getchar();
return 0;
}
---------Kod natywny--------------
// SpeedTest_Cpp.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <tchar.h>
#include <windows.h>
using namespace std;
class cLine{
public:
float X1;
float X2;
};
class cShape{
public:
int a;
cLine Line;
};
int CreateObjects(int xVal){
cShape pShape;
int pVal;
pShape.Line.X1 = xVal;
pShape.Line.X2 = xVal * 2;
pVal = pShape.Line.X1 + pShape.Line.X2 / xVal;
return pVal;
}
int _tmain(int argc, _TCHAR* argv[])
{
int pVal, pValA = 0;
int pStart, pEnd;
printf("%s\n", "Starting ...");
pStart = GetTickCount();
for (int i = 0; i < 1000000000; i++)
{
pValA += CreateObjects(i);
}
pEnd = GetTickCount();
pVal = pEnd - pStart;
printf("%d\n", pVal);
printf("%d\n", pValA);
printf("%s", "Press Enter to Continue");
getchar();
return 0;
}