mar*_*raz 2 .net c# extern reference-implementation
在我学习一些微观性能技术的同时,我在array.cs文件中遇到了.net框架中对二进制搜索函数的外部引用.
private static extern bool TrySZBinarySearch(Array sourceArray, int sourceIndex, int count, Object value, out int retVal);
Run Code Online (Sandbox Code Playgroud)
我在哪里可以找到此功能的文档?或者更好,它是如何实现的?为什么.net中有这么多SZ?
private static extern bool TrySZIndexOf(Array sourceArray, int sourceIndex, int count, Object value, out int retVal);
private static extern bool TrySZLastIndexOf(Array sourceArray, int sourceIndex, int count, Object value, out int retVal);
sealed class SZArrayHelper { ... }
Run Code Online (Sandbox Code Playgroud)
等等
[System.Security.SecurityCritical] // auto-generated
[ResourceExposure(ResourceScope.None)]
[MethodImplAttribute(MethodImplOptions.InternalCall)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
private static extern bool TrySZBinarySearch(Array sourceArray,
int sourceIndex, int count, Object value, out int retVal);
Run Code Online (Sandbox Code Playgroud)
这是从参考源检索到的声明.其中包含.NET框架的绝大部分源代码.你可以在这里下载.
使用[MethodImpl(MethodImplOptions.InternalCall)]归因的方法是用C++编写的,并包含在CLR中.CLR的源代码也可以从SSCLI20获得,SSCLI20是CLR的共享源版本,旨在帮助将.NET移植到其他操作系统.它有点过时了,因为它是在.NET 2.0时间框架发布的,但许多主辅助函数仍然是准确的.你可以在这里下载.
您将在clr/src/vm/ecall.cpp中找到TrySZBinarySearch,这是查找InternalCall方法的第一个位置.您将看到它映射到ArrayHelper :: TrySZBinarySearch()C++方法,您将在clr/src/vm/comarrayhelper.cpp中找到它.
没有什么非常有趣的,只是一个专门用于各种简单值类型的纯二进制搜索算法.在这个答案中你会发现它是用C++而不是C#编写的.
SZ是单维零基础的简称,你可以从C#array []声明得到这种数组.在C#中更好地称为"向量".由于它是如此常用,因此经过微量优化.
更新:今天使用github提供的CoreCLR源代码更容易看到,功能就在这里.
| 归档时间: |
|
| 查看次数: |
371 次 |
| 最近记录: |