草庐IT

OPTIMIZATION

全部标签

c++ - 尾调用优化似乎会稍微降低性能

在快速排序实现中,左侧的数据是针对纯-O2优化的代码,右侧的数据是针对-O2优化的代码(已启用-fno-optimize-sibling-calls标志),即关闭了尾部调用优化功能。这是3次不同运行的平均值,变化似乎可以忽略不计。值的范围是1-1000,以毫秒为单位。编译器是MinGWg++,版本6.3.0。sizeofarraywithTLO(ms)withoutTLO(ms)8M35,08334,0514M8,9528,6271M613609下面是我的代码:#includeusingnamespacestd;intN=4000000;voidqsort(int*arr,intsta

c++ - 将数据从未对齐结构的数组移动到 C++ 中的对齐数组

将数据从CameraSpacePoint数组移动到PointXYZ数组的最佳方法是什么?structCameraSpacePoint{floatX;floatY;floatZ;};__declspec(align(16))structPointXYZ{floatx;floaty;floatz;};constexprintBIG_VAL=1920*1080;CameraSpacePointcamera_space_points[BIG_VAL];PointXYZpoints_xyz[BIG_VAL];我的解决方案:CameraSpacePoint*camera_space_points_

c++ - boost Weak_Ptr : Destruction is more expensive than expected

无论出于何种原因,我们看到销毁弱指针的成本相当高。这是罪魁祸首代码:~weak_count()//nothrow{if(pi_!=0)pi_->weak_release();//Consumesahugechunkofourtime.#ifdefined(BOOST_SP_ENABLE_DEBUG_HOOKS)id_=0;#endif}我们没有处于Debug模式,调试Hook也没有启用。弱释放消耗了非常多的时间。这是一个已知的问题?我们做错了什么吗?boost版本:1.36编译器:VS2008编译器套件。不幸的是,由于各种原因,我们被锁定在这个Boost版本中,所以我更想知道这些奇怪的

c++ - 使用 memoized 函数观察到奇怪的性能

我正在研究使用欧几里德算法计算两个数的GCD的东西。我像往常一样实现了标准的单线,并且效果很好。它用于计算系列并调用gcd()的算法中每个元素多次,如n变大。我决定看看我是否可以通过内存来做得更好,所以这是我尝试过的:size_tconstgcd(size_tconsta,size_tconstb){returnb==0?a:gcd(b,a%b);}structmemoized_gcd:privatestd::unordered_map{size_tconstoperator()(size_tconsta,size_tconstb){unsignedlonglongconstkey=(

c++ - 为什么我的直接四元数乘法比 SSE 快?

我经历了几个不同的四元数乘法实现,但我很惊讶地发现引用实现是迄今为止我最快的实现。这是有问题的实现:inlinestaticquatmultiply(constquat&lhs,constquat&rhs){returnquat((lhs.w*rhs.x)+(lhs.x*rhs.w)+(lhs.y*rhs.z)-(lhs.z*rhs.y),(lhs.w*rhs.y)+(lhs.y*rhs.w)+(lhs.z*rhs.x)-(lhs.x*rhs.z),(lhs.w*rhs.z)+(lhs.z*rhs.w)+(lhs.x*rhs.y)-(lhs.y*rhs.x),(lhs.w*rhs.w)

c++ - 访问三个静态数组比访问一个包含 3x 数据的静态数组更快?

我有700个项目,我循环遍历700个项目,获取项目的三个属性并执行一些基本计算。我使用两种技术实现了这一点:1)三个700个元素的数组,一个数组对应三个属性中的每一个。所以:item0.a=array1[0]item0.b=array2[0]item0.e=array3[0]2)一个2100元素的数组,连续包含三个属性的数据。所以:item0.a=array[(0*3)+0]item0.b=array[(0*3)+1]item0.e=array[(0*3)+2]现在三个项目属性a、b和e在循环中一起使用-因此如果您存储它们在一个阵列中的性能应该比使用三阵列技术更好(由于空间局部性)。然

c++ - 一个空的类会被优化掉吗

假设我有以下类(class):classA{};然后在我的代码中有一个函数:Afoo(){Aret;//Dostuffreturnret;}然后我稍后使用该函数......优化编译器(如g++)是否会将foo()视为void函数并跳过实际为空对象分配内存?它可能不会这样做,因为即使空类的大小也为1。 最佳答案 这是gcc.godbolt.org的用例您可以在其中查看生成的汇编代码(我建议您单击着色按钮以查看哪个C++代码对应于哪个汇编代码)。您可以看到即使使用-O0也没有生成代码来分配或复制对象。您可以尝试使用其他编译器和优化级别。

c++ - 具有数组分配的编译器的不同行为

与MSVC++2008相比,我最近发现g++有一个有趣的行为。考虑这个小程序:#includeconstintARR_LENGTH=512;voiddoSomething(intiLen);intmain(intargc,char**argv){doSomething(ARR_LENGTH);return0;}voiddoSomething(intiLen){intiTest[iLen];return;}它会编译吗?你怎么看?根据我对C(或C++)的了解,这不应该编译,因为我可以用我想要的任何整数调用函数doSomething(),所以iTest数组的大小无法在编译时确定。然而,当我尝

c++ - 我如何分析超出每个功能级别的代码?

AFAIK分析器只能判断每个函数花费了多少时间。但由于C++编译器倾向于积极地内联代码,而且一些函数并不那么短,因此了解更多细节通常很有用-每个构造消耗多少时间。除了将代码重组为更小的函数外,如何实现这一点? 最佳答案 如果您使用采样分析器(例如Zoom或Shark),而不是仪器化分析器(例如gprof),那么您可以获得更细粒度的分析器配置文件,细化到语句和指令级别。 关于c++-我如何分析超出每个功能级别的代码?,我们在StackOverflow上找到一个类似的问题:

c++ - 是否有针对 C++ 优化编译器的良好测试?

我正在评估基于简单代码示例的VisualC++10优化编译器,看看生成的机器代码有多好,到目前为止我没有创意用例。是否有一些示例代码库通常用于评估优化C++编译器的好坏? 最佳答案 唯一有效的基准是模拟您正在开发的代码类型的基准。优化器对不同的应用程序和不同的编码风格有不同的react,唯一真正重要的是您将使用编译器编译的代码。 关于c++-是否有针对C++优化编译器的良好测试?,我们在StackOverflow上找到一个类似的问题: https://stac