7

memcmp通过从 导入函数来比较 .Net 中的两个字节数组有一种众所周知的效率,如此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);

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

寻找一个专注于单声道的答案。谢谢。

4

2 回答 2

6

根据您的更新,您不应该使用__MonoCS__预处理器。这意味着您必须为 Mono 和 .NET 重新编译库。更好的方法是使用dllmapMono 中的功能并且只使用msvcrt.dllDllImport。

而是定义一个“AssemblyName.dll.config”并在 Mono 上运行时使用该dllmap标记映射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代码块访问字节数组,其速度几乎与 native 一样快memcmp。在你沿着这条路走之前,确保直线for循环的速度不足以满足你的目的。

于 2012-12-17T23:39:13.050 回答