2011-12-25 2 views
2

多量のバイナリ操作が必要なC#コードがあるので、C#メソッドの1つを置き換えるアンマネージドC++メソッドを書きました。私のショックでは、10倍は遅かったですか?私はプロファイルを実行し、メソッド自体ではなく、外部メソッドを呼び出すオーバーヘッドに起因することを発見しました。C#からの呼び出しのためのアンマネージドC++コードのマネージC++への翻訳

私は管理されたC++でメソッドを記述すると、呼び出しのオーバーヘッドが緩和されますが、C++の速度はまだ変わらないと思いました。まず、この仮定は有効ですか?ここで

は私のアンマネージドC++コードです:ここでは

#include "stdafx.h"; 

unsigned __int32 _stdcall LSB_i32(unsigned __int32 x) 
{ 
    DWORD result; 
    _BitScanForward(&result, x); 
    return (unsigned __int32)result; 
} 

は、私のC#のコードです:

public static partial class Binary 
{ 
    [DllImport(@"CPP.dll")] 
    public static extern int LSB_i32(int value); 
} 

私はここで何も悪いことをやっていますか?

上記をマネージC++に変換するにはどうすればよいですか?私はこれを閲覧しましたが、管理されたC++には慣れていないので、私は遠くには行きませんでした。

答えて

2

管理されていないメソッドを残してもかまいませんが、非常に頻繁にマネージコードから呼び出すべきではありません。たとえば、管理しにくいメソッドを厳密なループで呼び出す場合、管理コードと非管理コードのマーシャリングのオーバーヘッドが膨大になります。したがって、このループをアンマネージコードの中に入れて、メソッドの呼び出しを1回だけ実行することができます。その後、マーシャリング価格は一度だけ支払われ、全体の管理はアンマネージドコードで行われます。

管理対象のC++に変換する限り、これは、これが、あなたが始めたもの(つまり、完全に管理されたC#コード)よりも優れたものになることは間違いありません。純粋なC#実装が速い場合

+0

残念ながら、私はループ内のコードを配置することはできません。私がやっていることのC++コードは、複雑なC#バイナリ操作よりもはるかに高速でなければならない、そのコアの単一のASM関数(bsr)でなければなりません。他に何もないなら、私は試してみたい。 – IamIC

+1

@IanC、この場合、完全に管理されたコードのままにしておきます。はるかに高速に実行されます。 –

+0

あなたは完全に管理されたC#コードを意味しますか?確かにそれが管理されている場合、私は管理されたC + +を書くことができ、それから利益を得ることができるはずですか? – IamIC

0

あなたが試すことができます:それはヘルパー関数であるとして

static int lzc(int x) 
{ 
    x |= (x >> 1); 
    x |= (x >> 2); 
    x |= (x >> 4); 
    x |= (x >> 8); 
    x |= (x >> 16); 

    x = x - ((x >> 1) & 0x55555555); 
    x = (x & 0x33333333) + ((x >> 2) & 0x33333333); 
    x = (x + (x >> 4)) & 0x0f0f0f0f; 
    x = x + (x >> 8); 
    x = x + (x >> 16); 
    return 32 - (x & 0x0000003f); 
} 
+0

ありがとうございます。私はC#でこれよりはるかに高速な実装をしています。私が知りたいのは、マネージC++で上記のコードを書く方法です。 – IamIC