是否有一个memcmp等效于比较Mono中的字节数组?

时间:2012-12-17 23:15:49

标签: c# c mono bytearray memcmp

通过从memcmp导入msvcrt.dll函数来比较.Net中的两个字节数组有一个众所周知的效率,如here所述。

单声道中是否有等效的库导入?在linux或Windows上运行mono时需要有所不同吗?或者是否有另一种快速字节数组比较技术在单声道中运行良好?我正在寻找比在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);

但我还没有尝试过。我以前从未在单声道上进行p / invoke。我正在使用pinvoke.net上建议的签名。这会兼容吗?

寻找以单调为重点的答案。感谢。

2 个答案:

答案 0 :(得分:6)

根据您的更新,您不应使用__MonoCS__预处理器。这意味着你必须为Mono和.NET重新编译库。更好的方法是在Mono中使用dllmap功能,并仅使用msvcrt.dll DllImport。

而是定义“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应该有用。

答案 1 :(得分:2)

您可以使用unsafe代码块来访问字节数组,几乎与本机memcmp一样快。在你走这条路之前,确保直线for循环不够快,无法达到你的目的。