c# – 如何在避免间接调用的同时编写通用代码?
发布时间:2020-12-15 08:35:34 所属栏目:百科 来源:网络整理
导读:有没有办法在C#中调用写通用程序和算法,同时避免动态解决方案的开销? 考虑一个简单的例子: static void QuickSortT(T[] arr,int left,int right,ComparisonT compare){ do { int i = left; int j = right; var x = arr[i + ((j - i) 1)]; do { while (i ar
有没有办法在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. 有没有办法在编写通用代码时避免这种间接调用? 解决方法
如果比较项目,答案是否定的:你不能把一个>在x和arr [j]之间,并期望编译器弄清楚你的意思是它应用它的内置>对类型为T的对象的运算符
但是,您的解决方案可能会稍微优化一下,因为您要为间接付费两次.由于您已宣布您的T为IC Comparable< T>已经,你可以删除比较器参数,并调用x.CompareTo(arr [j])而不通过lambda.这将减少第二个间接的开销.当然,它不会让您自定义比较项目的方式,但这将是支付CPU周期灵活性的例行情况. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读