草庐IT

OPTIMIZATION

全部标签

c++ - 通过重新排序优化分支

我有这种C函数——它被调用了无数次:voidfoo(){if(/*condition*/){}elseif(/*another_condition*/){}elseif(/*another_condition_2*/){}/*Andsoon,Ihave4ofthem,butwecangeneralizeit*/else{}}我有一个很好的测试用例调用这个函数,导致某些if分支比其他分支被调用更多。我的目标是找到安排if语句以最小化分支的最佳方式。我能想到的唯一方法是为分支到的每个if条件写入一个文件,从而创建一个直方图。这似乎是一种乏味的方式。有没有更好的方法、更好的工具?我在AS3L

c++ - 如何优化指针间接层

我正在尝试在繁重的计算应用程序中优化这类事情:说我有一个doubled[500][500][500][500];至少从编译器的角度来看,以下是相当昂贵的doubled[x][y][j][k]我想告诉编译器它是连续的内存,以方便计算偏移量。在我的例子中,我有这样的东西:doublen=0;for(inti=0;i所以我试图通过将它放在一个单独的函数中来优化它voidfunc(double***constrestrictdMatrix){/*anddosomecalculationsherel*/}没有太大帮助:(有什么优化建议吗?编辑我无法重写代码使数组成为一维。我必须和这个多维的野兽一

c++ - C/C++ 编译器会优化这个 if 语句吗?

我有这样的代码,但我觉得它有点难读://code1if((expensiveOperation1()&&otherOperation()&&foo())||(expensiveOperation2()&&bar()&&baz()){//dosomething}我只是将其更改为以下内容,以使其更具可读性://code2constboolexpr1=expensiveOperation1()&&otherOperation()&&foo();constboolexpr2=expensiveOperation2()&&bar()&&baz();if(expr1||expr2){//oneof

C# 比 C++ 运行得更快?

我和一个friend写了一个加密模块,我们想把它移植到多种语言,这样它就不是特定于平台的加密。最初是用C#编写的,我已经将它移植到C++和Java中。C#和Java都将以大约40MB/s的速度加密,但C++将仅以大约20MB/s的速度加密。为什么C++运行得这么慢?是因为我使用的是VisualC++吗?我可以做些什么来加速我的代码?是否有不同的编译器可以更好地优化C++?我已经尝试过优化代码本身,例如使用x>>3而不是x/8(整数除法),或者y&63而不是y%64和其他技术。我如何以不同的方式构建项目,以便它在C++中具有更高的性能?编辑:我必须承认我没有研究编译器如何优化代码。我将在

C++ 调整/优化

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我在这个页面上阅读http://www.theregister.co.uk/2011/06/03/google_paper_on_cplusplus_java_scala_go/以下内容:C++提供四种语言中最快的运行时间。但是,该论文说,它还需要更广泛的“调整工作,其中许多工作的复杂程度是普通程序员无法达到的。”我是C++的忠实粉丝,显然还在学习。我的

C++ 隐藏符号增加重定位时间

我正在尝试优化具有200多个依赖项的库的加载时间。我尝试使用可见性属性隐藏符号,这使我将导出符号的数量减少了30%。查看elf直方图,优化后桶的数量保持不变,但成功和不成功的查找减少了很多。布隆过滤器大小从8kb减小到4kb,但设置的位数从19%增加到24%。尽管加载时间增加了,我认为这是由于布隆过滤器中设置的位数比以前更高。查看依赖项,我可以看到大约有400.000个符号在重定位时没有成功地查看我的库。布隆过滤器用于过滤其中的大部分,但由于位集的数量较多,误报的数量从3.6%增加到5.76%(我在互联网上找到这个公式:误报=bitsets%^2)在优化之前做一些数学计算,我不得不在我

c++ - 是否允许编译器优化堆内存分配?

考虑以下使用new的简单代码(我知道没有delete[],但它不属于这个问题):intmain(){int*mem=newint[100];return0;}是否允许编译器优化new调用?在我的研究中,g++(5.2.0)和VisualStudio2015不优化new调用,whileclang(3.0+)does.所有测试都是在启用完全优化的情况下进行的(-O3用于g++和clang,用于VisualStudio的Release模式)。new不是在幕后进行系统调用,使得编译器不可能(并且非法)对其进行优化吗?编辑:我现在已经从程序中排除了未定义的行为:#includeintmain()

c++ - 遍历对象集合的最快方法

首先给你一些背景:我有一些执行蒙特卡洛模拟的研究代码,本质上发生的事情是我遍历一组对象,从它们的表面计算一些vector,然后对每个vector我遍历再次收集对象以查看vector是否击中另一个对象(类似于光线追踪)。伪代码看起来像这样foreachobject{foranumberofvectors{dosomecomputationsforeachobject{checkifvectorintersects}}}由于对象的数量可能非常大,光线的数量甚至更多,我认为优化遍历对象集合的方式是明智的。我创建了一些测试数组、列表和vector的测试代码,对于我的第一个测试用例,我发现vec

c++ - 从源代码编译与 deb 包编译

我正在Ubuntu上从源代码编译几个C/C++包。我将构建的结果与使用debian安装运行的结果进行比较,发现我的可执行文件速度较慢。我使用readelf-a来比较这两个可执行文件。“.rela.dyn”的重定位部分之类的东西有很大不同,但我不确定我应该寻找什么样的文档来理解这样的差异。有没有人对尝试调整gcc来生成像我在deb包中找到的可执行文件有任何建议? 最佳答案 好吧,因为它是开源的,你应该得到他们用来生成可执行文件的编译标志:)我的2c 关于c++-从源代码编译与deb包编译,

c++ - 使用线程池进行模拟: boost-thread and boost-asio

我想使用boost::asio来设置线程池。我的问题是:如何将特定数据附加到创建的每个线程,以及如何管理单独的输出?更具体地说,我编写了一个类Simulation,它通过一种在输入中获取一些参数的方法来执行模拟。该类包含计算所需的所有数据。由于数据不是太大,我想复制它以便在池的每个线程中使用类Simulation的不同实例。我想做这样的事情:(这里解释了如何设置线程池:SO和Asiorecipes)classParallelSimulation{public:staticconststd::size_tN=10;protected:std::vector>simuInst;//Ncop