7

here で説明されているように、memcmpから関数をインポートすることにより、.Net の 2 つのバイト配列を比較する効率がよく知られています。msvcrt.dll

モノに同等のライブラリインポートはありますか? LinuxまたはWindowsでモノを実行する場合、異なる必要がありますか? または、モノでうまく機能する別の高速なバイト配列比較手法はありますか? C# で配列を反復処理するよりも優れたものを探しています。

アップデート

Matt Patenaude のコメントに基づいて、これはうまくいくと思います。

#if __MonoCS__
    [DllImport("c", CallingConvention = CallingConvention.Cdecl)]
#else
    [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
#endif
    public static extern int memcmp(byte[] b1, byte[] b2, UIntPtr count);

しかし、私はまだ試していません。私は前に mono で p/invoke をしたことがありません。pinvoke.netで推奨されている署名を使用しています。これって両立するの?

モノに焦点を当てた答えを探しています。ありがとう。

4

2 に答える 2

6

更新に基づいて、__MonoCS__プリプロセッサを使用しないでください。これは、Mono および .NET 用にライブラリを再コンパイルする必要があることを意味します。より良い方法はdllmap、Mono の機能を使用し、msvcrt.dllDllImport のみを使用することです。

代わりに、「AssemblyName.dll.config」を定義し、dllmapタグを使用して、Mono で実行するときにマップmsvcrt.dllします。c

例:

<configuration>
    <dllmap dll="msvcrt.dll" target="libc.so.6" />
</configuration>

dllmap の詳細はこちら: http://www.mono-project.com/Config_DllMap

編集

そして、何らかの理由cで機能しない場合は、機能libc.soするはずです。

于 2012-12-18T04:27:40.880 に答える
2

コード ブロックを使用unsafeして、ネイティブとほぼ同じ速度でバイト配列にアクセスできますmemcmp。その道を進む前に、直線forループが目的に十分な速さではないことを確認してください。

于 2012-12-17T23:39:13.050 に答える