有没有办法在C#中调用写通用程序和算法,同时避免动态解决方案的开销?
考虑一个简单的例子:
static void QuickSort<T>(T[] arr,int left,int right,Comparison<T> compare) { do { int i = left; int j = right; var x = arr[i + ((j - i) >> 1)]; do { while (i < arr.Length && compare(x,arr[i]) > 0) i++; while (j >= 0 && compare(x,arr[j]) < 0) j--; if (i > j) { break; } if (i < j) { var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } i++; j--; } while (i <= j); if (j - left <= right - i) { if (left < j) QuickSort(arr,left,j,compare); left = i; } else { if (i < right) QuickSort(arr,i,right,compare); right = j; } } while (left < right); }
您可以称之为:
QuickSort(buffer,buffer.Length - 1,(a,b) => a.CompareTo(b))
虽然看起来很有效,但这个看起来很好看的例子为每次比较执行间接(即虚拟)调用.
显然,处理器无法优化间接呼叫,因此它们的性能很差.在我的计算机上,这意味着性能下降了25%,从大约3,600项/ ms减少到2,700项/ ms.
有没有办法在编写通用代码时避免这种间接调用?
无论我对委托,DynamicMethod等做多少杂耍,似乎总是在库代码和用户代码之间进行间接调用,这显然会对性能产生非常不利的影响.