草庐IT

OPTIMIZATION

全部标签

c++ - 快速加权均值和方差10格

我想加快我的代码的一部分,但我认为没有一种更好的方法可以进行以下计算:floatinvSum=1.0f/float(sum);for(inti=0;ifor循环中的numBins通常为10,但是经常会调用此位(频率为每秒80帧,每帧至少被调用8次)我尝试使用一些SSE方法,但这只是稍微加快了这段代码的速度。我想我可以避免两次计算midPoint,但是我不确定如何计算。有没有更好的方法来计算fmean和var?这是SSE代码://makehistcontainamultipleof4validvaluesfor(inti=numBins;i我可能做错了,因为我没有得到很多期望的改进。SS

c++ - 使用构造函数更改 vector 类型?

我有一个充满整数的vector。我有一个以整数作为构造函数的类。我想创建一个充满此类的新vector,使用第一个vector中的值作为每个vector的构造函数。我觉得我目前的方法可以大大优化。vectorintegers=/*something...*/;vectorclazzes();for(auto&n:integers){clazzes.emplace_back(clazz(n));} 最佳答案 有aconstructorstd::vector接受范围并允许用户定义的转换。这就是您所需要的:templatevector(In

c++ - 编译器在哪里存储 C++ 类的方法?

这比什么都更让人好奇......假设我有一个C++类Kitty,如下所示:classKitty{voidMeow(){//Dostuff}}编译器是否将Meow()的代码放在Kitty的每个实例中?显然,到处重复相同的代码需要更多的内存。但另一方面,在现代处理器上,分支到附近内存中的相对位置需要的汇编指令比分支到内存中的绝对位置更少,因此这可能更快。我想这是一个实现细节,所以不同的编译器可能会有不同的表现。请记住,我在这里不考虑静态或虚拟方法。 最佳答案 在通常的实现中,任何给定函数只有一个拷贝。给定对象实例的代码和数据之间的关联是

c++ - 了解 CPU 如何决定将什么加载到高速缓存中

假设一台计算机有64k的L1缓存和512k的L2缓存。程序员已经在主内存中创建/填充了一个包含10mb数据的数组(例如3d模型的顶点/索引数据)。数组可能包含一系列结构,例如:structx{vec3pos;vec3normal;vec2texcoord;};接下来程序员必须对所有这些数据执行一些操作,例如一次正常计算,然后将数据传递给GPU。CPU如何决定如何将数据加载到二级缓存中?程序员如何检查给定架构的高速缓存行的大小?程序员如何确保组织数据以适合缓存行?数据与字节边界对齐是唯一可以帮助此过程的方法吗?程序员可以做些什么来最大限度地减少缓存未命中?有哪些分析工具可以帮助可视化Wi

C++ 错误 : ‘_mm_sin_ps’ was not declared in this scope

我正在尝试对将函数应用于数组的不同方法进行基准测试。为什么是https://software.intel.com/sites/landingpage/IntrinsicsGuide/#expand=3260,2124,4779,4779&cats=Trigonometry&text=_sin_mm_sin_ps在我的范围内未知,但_mm_sqrt_ps是?我如何让它为人所知?并编译无误。#include#include#include#include#include#include#include"immintrin.h"#includeintmain(){std::coutdis(-

c++ - C/C++ 编译器是否会对可交换运算符(例如 : +, *)进行重新排序以优化常量

请问第2行下面的代码intbar;intfoo=bar*3*5;优化为intbar;intfoo=bar*15;甚至更多:intfoo=3*bar*5;可以优化吗?目的其实是问我能不能随便写intfoo=bar*3*5;代替intfoo=bar*(3*5);保存括号。(并且减轻了手动操作那些常量排序的需要=>并且在许多情况下,将常量与相关变量分组比将常量分组以进行优化更有意义) 最佳答案 几乎所有的编译器都会对整数执行此操作,因为即使常量折叠可能以不同的方式溢出,标准也可能会忽略溢出,因此他们可以做他们喜欢的事情。如果遵循严格的fl

c++ - 优化是否会影响使用其 PDB 调试 VC++ 应用程序的能力?

为了能够正确调试发布版本,需要一个PDB文件。当编译器使用不同类型的优化(FPO、PGO、内部函数、内联等)时,PDB文件是否会变得不太可用?如果是这样,优化的效果是严重的还是仅仅导致相邻的代码行混淆?(我正在使用VC2005,并且总是会选择可调试性而不是优化性能-但问题是一般性的) 最佳答案 是的,优化后的代码不易调试。不仅缺少一些信息,有些信息还会产生很大的误导性。我认为最大的问题是局部变量。编译器可以在整个函数中为多个变量使用相同的堆栈地址或寄存器。正如其他海报所提到的,有时甚至弄清楚“this”指针是什么都需要一些时间。在调

c++ - GCC 会为运行时保留固定值的算术运算还是编译输出?

我想知道GCC是否会将具有固定值的算术保留在运行时执行,或者是否会将其设置为它的答案,例如。constfloathalfPi=M_PI/2;它会“归结”方程并设置constfloathalfPi=1.57079;还是将算法留给运行时? 最佳答案 嗯...如果我们谈论积分,答案将是明确的是(在通用术语ConstantFolding).即使冗长的计算也可以在编译时完成……这实际上是模板非类型参数评估和(现在)constexpr变量所必需的。在浮点表示的情况下,一旦计算变得更复杂,事情就会变得有点复杂。问题在于,不同大小(以及精度)的浮点

c++ - 位操作 : keeping the common part at the left of the last different bit

考虑两个用二进制写的数字(左边是MSB):X=x7x6x5x4x3x2x1x0和Y=y7y6y5y4y3y2y1y0这些数字可以有任意位数,但都是同一类型。现在考虑x7==y7、x6==y6、x5==y5,但是x4!=y4。如何计算:Z=x7x6x500000或者换句话说,如何有效地计算一个数字,使公共(public)部分保持在最后一个不同位的左侧?templateinlineTf(constTx,constTy){//Somethinghere}例如,对于:x=10100101y=10110010它应该返回z=10100000注意:这是为了super计算的目的,这个操作将被执行数千亿

C++ throw() 优化

根据OptimizingC++,Usetheemptyexceptionspecification(thatis,appendthrow()tothedeclaration)forthefunctionsyouaresurewillneverthrowexceptions.如果我知道我的90%的方法不会抛出异常怎么办?将throw()附加到所有这些方法似乎非常规且冗长。如果没有,有什么好处?还是我误解了什么? 最佳答案 C++11引入了noexcept,throw有点被弃用(并且根据this效率较低)noexceptisanimpr