草庐IT

OPTIMIZATION

全部标签

c++ - 我如何优化/改进这个哈希函数

我有一个存储四叉树条目的哈希表。哈希函数如下所示:四叉树哈希#definenode_hash(a,b,c,d)\(((int)(d))+3*(((int)(c))+3*(((int)(b))+3*((int)(a))+3)))请注意,此操作的结果始终使用模素数进行分块,如下所示:h=node_hash(p->nw,p->ne,p->sw,p->se);h%=hashprime;...与最优哈希的比较一些统计分析表明,此哈希在减少冲突方面是最佳的。给定一个包含b个桶和n个条目的哈希表。使用完美哈希的碰撞风险是:(n-b*(1-power((b-1)/b,n))))*100/n当n=b时,

c++ - 传递给 std::sort 时,全局函数比仿函数或 lambda 慢

我做了一个小测试来检查全局函数/仿函数/lambda作为std::sort函数的比较器参数的性能。Functor和lambda具有相同的性能。我惊讶地发现,看起来是最简单回调的全局函数却慢得多。#include#include#include#include#include#include#include#include#includeusingnamespacestd;constintvector_size=100000;boolCompareFunction(conststring&s1,conststring&s2){returns1[0]v(vector_size);for(s

java - C++/ java : Efficiently find a set in the collection containing given value

假设我们有一组互斥集合{A,B,C,D}其中A={1,2,3},B={4,5,6},C={7,8,9},D={10,11,12}给定一个值Z,例如3,我希望它返回集合A的索引,因为A的成员是3。问题是我如何使用C++或JAVA高效地完成它。我当前的解决方案:将A、B、C、D作为HashSet(或C++中的unordered_set)存储在容器中并循环遍历每个集合,直到包含Z找到了。问题在于容器中存储的集合数量的复杂度为O(n)。有什么方法(或任何数据结构来存储这些集合)比O(n)更快地做到这一点吗? 最佳答案 您可以创建一个将值映射

c++ - 为什么 GCC 生成的代码会从堆栈中读取垃圾?

考虑以下代码(使用Eigen):#include#includetemplateinlinetypenamestd::enable_if::typesetRow(Eigen::Matrix&){}templateinlinetypenamestd::enable_if::typesetRow(Eigen::Matrix&m,Rvval,Rs...args){m(row,N)=val;setRow(m,args...);}templateclassMatrixConstructor{Eigen::Matrixm;public:MatrixConstructor(constEigen::M

c++ - 指针上的指针 - 性能损失的原因

我回答了thisquestion,并注意到我认为编译器的一种奇怪行为。我首先编写了这个程序(作为我在那里回答的一部分):classVector{private:double**ptr;public:Vector(double**_ptr):ptr(_ptr){}inlinedouble&operator[](constintiIndex)const{return*ptr[iIndex];}};extern"C"inttest(constdoublea);intmain(){doublea[2]={1.0,2.0};Vectorva((double**)&a);doublea1=va[0

c++ - 为什么这个 SOR 求解器的速度取决于输入?

关于我的otherquestion,我现在修改了稀疏矩阵求解器以使用SOR(连续过度松弛)方法。现在的代码如下:voidSORSolver::step(){floatconstomega=1.0f;floatconst*b=&d_b(1,1),*w=&d_w(1,1),*e=&d_e(1,1),*s=&d_s(1,1),*n=&d_n(1,1),*xw=&d_x(0,1),*xe=&d_x(2,1),*xs=&d_x(1,0),*xn=&d_x(1,2);float*xc=&d_x(1,1);for(size_ty=1;y现在奇怪的是:如果我增加omega(松弛因子),执行速度开始显着

c++ - 英特尔编译器与 GCC

当我使用Intel的编译器编译应用程序时,它比使用GCC编译它时慢。英特尔编译器的输出速度要慢2倍以上。该应用程序包含多个嵌套循环。GCC和我遗漏的Intel编译器之间有什么区别吗?我是否需要打开一些其他标志来提高英特尔编译器的性能?我希望英特尔编译器至少与GCC一样快。编译器版本:Intelversion12.0.020101006GCCversion4.4.420100630Thecompilerflagsarethesamewithbothcompilers:-O3-openmp-parallel-mSSE4.2-Wall-pthread 最佳答案

c++ - C++ 中继承的运行时成本(没有虚拟性)?

在使用-O3编译的C++中,没有虚拟性的继承是否有以下方面的成本:执行时间内存如果答案是肯定的:为什么?例如:MyClass1和MyClass2在性能和内存方面是否相同? 最佳答案 executiontime什么?函数是静态解析的,所以函数调用是一样的。MyClass1的构造函数会调用基类的构造函数,而它的析构函数会调用基类的析构函数,所以构造和析构可能会有一些开销。也许。一些编译器可能会优化调用。memory这将是相同的,两者都只有一个成员double。理论上。我猜这取决于实现,因为它不是标准强制要求的,但最常见的是不会有内存开销

c++ - 为什么当我使用 std::algorithms 而不是普通循环时这段代码变慢了?

我正在计算vector元素的均值和标准差。我有两个版本,我完全不明白为什么使用标准算法的版本比使用普通循环的版本慢。两个版本都使用这个结构作为返回类型:structMeanAndSigma{doublemean;doublesigma;};带循环的版本是这样的:MeanAndSigmagetMeanAndSigma(constDVector&v){MeanAndSigmams;ms.mean=0;for(inti=0;i还有算法:MeanAndSigmagetMeanAndSigma2(constDVector&v){MeanAndSigmams;ms.mean=std::accumu

c++ - 在C/C++结构中添加UNUSED元素会加快并减慢代码执行速度

我编写了以下结构,供我正在使用的Arduino软件PWM库中使用,以一次PWM(最多20个引脚(在Uno上)或一次最多70个引脚(在Mega上))。如所写,代码的ISR部分(eRCaGuy_SoftwarePWMupdate())处理此结构的数组,需要133us来运行。但是很奇怪,如果我取消注释“byteflags1;”行,则为。(在struct中),尽管flags1尚未在任何地方使用,但ISR现在需要158us来运行。然后,如果我取消注释“byteflags2;”因此现在BOTH标志都已取消注释,运行时回落到(133us)之前的位置。为什么会这样呢?以及我该如何解决?(即:对于该特定