测试代码如下:
template <typename T>bool PredDefault(const T &a,const T &b) {return a > b;}template <typename T>bool PredDefaultReverse(const T &a,const T &b) {return a < b;}template <typename T>voID Sort8(T* Data,bool(*pred)(const T &a,const T &b) = PredDefault) { #define Cmp_Swap(a,b) if (pred(Data[a],Data[b])) {T tmp = Data[a]; Data[a] = Data[b]; Data[b] = tmp;} Cmp_Swap(0,1); Cmp_Swap(2,3); Cmp_Swap(4,5); Cmp_Swap(6,7); Cmp_Swap(0,2); Cmp_Swap(1,6); Cmp_Swap(5,7); Cmp_Swap(1,2); Cmp_Swap(5,6); Cmp_Swap(0,4); Cmp_Swap(3,7); Cmp_Swap(1,5); Cmp_Swap(2,6); Cmp_Swap(1,6); Cmp_Swap(2,5); Cmp_Swap(3,4);}int lastTick;int tick() { int hold = lastTick; lastTick = GetTickCount(); return lastTick - hold;}int main(){ vector<vector<float>> rVec(1000,vector<float>(8)); for (auto &v : rVec) { v[0] = ((float)rand()) * 0.001; v[1] = ((float)rand()) * 0.001; v[2] = ((float)rand()) * 0.001; v[3] = ((float)rand()) * 0.001; v[4] = ((float)rand()) * 0.001; v[5] = ((float)rand()) * 0.001; v[6] = ((float)rand()) * 0.001; v[7] = ((float)rand()) * 0.001; } system("PAUSE"); tick(); for (int n = 0; n < 50000; n++) for (int j = 0; j < rVec.size(); j++) { std::sort(rVec[j].begin(),rVec[j].end(),PredDefault<float>); std::sort(rVec[j].begin(),PredDefaultReverse<float>); //Sort8(rVec[j].data(),PredDefault<float>); //Sort8(rVec[j].data(),PredDefaultReverse<float>); } cout << "\nTime: " << tick() << "\n"; system("PAUSE"); return 1;}
在测试一个或另一个时添加/删除注释标记.
我没有期待太多,但差异是10倍支持交换排序的东西(在vs2012的发布配置中完成测试,关闭了节能功能).结果也检查出来.这是正确的吗?
解决方法 有几个原因我可以想到.>您有硬编码比较.这有助于管道化多个指令,从而提高效率.但想象一下编码为N = 1000.你必须写1000 * 1000比较.> std :: sort进行O(nlogn)比较.但是这个大O符号适用于大N,因为符号常量可能很大.因此,您无法通过运行8个值的范围来判断效率.
总结以上是内存溢出为你收集整理的c – 排序:这种性能差异是真的还是我做错了?全部内容,希望文章能够帮你解决c – 排序:这种性能差异是真的还是我做错了?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)