通过从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上建议的签名。这会兼容吗?
寻找以单调为重点的答案。感谢。
答案 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
循环不够快,无法达到你的目的。