Unmanaged vs. Managed

booom

Grünschnabel
Hallo Community,
folgendes Problem:
Ich versuche mich ins Thema unmanaged DLLs in C# einzuarbeiten. Grund hierfür ist klar das Beschleunigen von Algorithmen.

Nun habe ich zum Testen eine for-Schleife in der dll und eine forschleife in der C#-Form erstellt und lasses eine Textbox füllen, sobald die Schleife durchgezählt wurde.
Merkwürdigerweise ist managed Code in dem Fall ca. 10% schneller (subjektiv).

Code:


DLL
Code:
// DLL_Test_1.cpp : Definiert den Einstiegspunkt für die DLL-Anwendung.
//

#include "stdafx.h"
#ifdef _MANAGED
#pragma managed(push, off)
#endif



BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
    return TRUE;
}

extern "C" __declspec(dllexport) int Rechnen(int Zahl1, int Zahl2);
extern "C" __declspec(dllexport) bool forSchleife(int hoehe);


int Rechnen(int Zahl1, int Zahl2)
{
	int Zahl3 = Zahl1+Zahl2;
	return (Zahl3);
}

bool forSchleife(int hoehe)
{
	int i;
	bool fertig = false;
	
	for(i = 0; i < hoehe; i++)
	{
		int testZahl = i;
	}
	
	fertig = true;
	return (fertig);
}


#ifdef _MANAGED
#pragma managed(pop)
#endif

Form
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace DLL_Benutzen
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox4.Text = "---------";

            Boolean Ready = DLLTest.forSchleife(1000000000);
            textBox4.Text = Ready.ToString();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            textBox5.Text = " ";
            Boolean managedReady = forSchleifeManaged(1000000000);
            textBox5.Text = managedReady.ToString();
        }

        public Boolean forSchleifeManaged(int hoehe)
        {
            Boolean managedFertig = false;
            for (int i = 0; i < 1000000000; i++)
            {
                int test = i;
            }
            managedFertig = true;
            return (managedFertig);
        }


    }
    static class DLLTest
    {
        [DllImport(@"DLL_Test_1.dll")]
        public static extern bool forSchleife(int hoehe);
    }

}

Wie kann das sein?

Danke für die Hilfe
booom
 
Das liegt daran, weil die Übergänge von Managed zu Unmanaged und zurück sehr teuer sind.
Es dauert ja schon einige Zeit, bis die C++-Dll geladen ist und die entsprechende Funktion gefunden.
 
Zurück