草庐IT

PERFORMANCE

全部标签

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++ - 当我使用非 cst 内存模型时,为什么我的自旋锁实现性能最差?

下面有两个版本的自旋锁。第一个使用默认值memory_order_cst,而后者使用memory_order_acquire/memory_order_release。由于后者更轻松,我希望它有更好的表现。然而,情况似乎并非如此。classSimpleSpinLock{public:inlineSimpleSpinLock():mFlag(ATOMIC_FLAG_INIT){}inlinevoidlock(){intbackoff=0;while(mFlag.test_and_set()){DoWaitBackoff(backoff);}}inlinevoidunlock(){mFla

c++ - OpenMP 代码远比串行慢 - 内存或线程开销瓶颈?

我正在尝试并行化(OpenMP)一些科学C++代码,其中大部分(>95%)的CPU时间花在计算N阶的讨厌(且不可避免)O(N^2)交互上~200种不同的颗粒。该计算重复1e10个时间步长。我用OpenMP尝试了各种不同的配置,每一个都比串行代码慢一些(至少一个数量级),并且随着额外的内核的添加,扩展性很差。下面是相关代码的草图,具有代表性的虚拟数据层次结构Tree->Branch->Leaf。每个Leaf对象存储自己的位置和当前和前三个时间步长的速度,等等。然后每个Branch存储一组Leaf对象,每个Tree存储一组Branch对象。这种数据结构非常适合复杂但CPU密集度较低的计算,

c++ - 在 C/C++ 中快速显示波形

我有兴趣在Windows和Linux上用C或C++实现音频编辑器。我不知道如何在完全缩小的View中足够快地显示波形。我不是在寻找有关快速帧缓冲技术的信息。这是一个关于算法和数据结构的问题,可以有效地确定要显示的内容。假设我希望能够编辑2小时长的5声道、48KHz、24位声音。这是5GB的示例数据。我希望能够从每个样本一个像素一直缩小,直到所有样本数据一次可见。我希望应用程序感觉响应迅速,即使是在速度较慢的机器上,例如1GHzAtom。当我说响应时,我希望GUI更新通常在用户输入的1/30秒内发生。在决定为完全缩小的View渲染什么时,天真的实现会扫描整个波形中的每个样本-它需要找到显

c++ - 为什么我的 swap<string,string> 比 std 版本慢得多?

这是我的C++代码:inlinestaticvoidswap(std::string&a1,std::string&a2){std::stringtemp(std::move(a1));a1=std::move(a2);a2=std::move(temp);}我运行此函数1000000次,平均耗时78毫秒,但std仅耗时13毫秒。刚刚看了下std::swap的实现,和我的差不多,为什么我的这么慢? 最佳答案 根据标准§21.3.2.8/p1swap[string.special](EmphasisMine):templatevoid

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

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

c++ - 我怎样才能使 cout 更快?

有什么方法可以使它运行得更快并且仍然做同样的事情吗?#includeintbox[80][20];voiddrawbox(){for(inty=0;yIDE:开发C++||操作系统:Windows 最佳答案 正如MarcB在评论中所说,先将输出放入字符串应该更快:intbox[80][20];voiddrawbox(){std::stringstr="";str.reserve(80*20);for(inty=0;y 关于c++-我怎样才能使cout更快?,我们在StackOverflo

c++ - Dijkstra 算法实现的性能

下面是我根据Wikipediaarticle中的伪代码编写的Dijkstra算法的实现。.对于具有大约40000个节点和80000条边的图,运行需要3或4分钟。这是正确的数量级吗?如果不是,我的实现有什么问题?structDijkstraVertex{intindex;vectoradj;vectorweights;doubledist;intprev;boolopt;DijkstraVertex(intvertexIndex,vectoradjacentVertices,vectoredgeWeights){index=vertexIndex;adj=adjacentVertices

c++ - 复制一张 map 有多贵?

我有一个map>在我的EntityRepresentation类(class)。我有点想为表示创建一个Builder类,但我必须考虑复制map的成本。EntityState复制起来很便宜,因为它只是静态函数的集合;boost::weak_ptr复制也很便宜。整个map怎么样? 最佳答案 不要过早优化。在许多情况下,构建器类的运行时性能不会成为瓶颈。一般来说,复制一张map的复杂度是O(n)。从评论看来,n很小。如果您已经确定您确实需要优化,那么在这种情况下,使用两个vector在访问项目和复制方面都会更便宜。

c++ - 内存访问与内存复制

我正在用C++编写一个应用程序,它需要从多个线程多次从同一内存读取只读数据。我的问题是,从性能的角度来看,为每个线程复制内存还是为所有线程提供相同的指针并让它们访问相同的内存会更好。谢谢 最佳答案 根据您提供的关于您的目标系统等的少量信息,没有明确的答案,但在普通PC上,最快的方法很可能是不复制。复制可能很慢的一个原因是,如果数据区域很大,它可能会导致缓存未命中。普通PC会在线程之间非常有效地缓存对同一数据区域的只读访问,即使这些线程恰好在不同的内核上运行。英特尔为其缓存方法明确列出的好处之一是"Allowsmoredata-sha