草庐IT

OPTIMIZATION

全部标签

c++ - 使用 <spontaneous> 解释 gprof 输出

我试图在我的程序中找到性能问题,因此通过分析来检测代码。gprof创建一个像这样的平面配置文件:Flatprofile:Eachsamplecountsas0.01seconds.%cumulativeselfselftotaltimesecondssecondscallsms/callms/callname27.974.104.10std::_Deque_iterator::_Deque_iterator(std::_Deque_iteratorconst&)6.965.121.02std::_Deque_iterator::difference_typestd::operator-

c++ - 使用 SIMD (AVX2) 进行稀疏数组压缩

我有一个稀疏数组a(主要是零):unsignedchara[1000000];我想创建一个b索引数组a在带有AVX2的英特尔x64架构上使用SIMD指令。我正在寻找如何有效地做到这一点的技巧。具体来说,是否有SIMD指令获取SIMD寄存器中连续排列的连续非零元素的位置? 最佳答案 计算非零值索引的五种方法是:半向量化循环:用字符加载SIMDvector,与零进行比较并应用移动掩码。如果任何字符非零,则使用小标量循环(也由@stgatilov建议)。这适用于非常稀疏的数组。下面代码中的函数arr2ind_movmsk使用了BMI1指令

c++ - 使用 valgrind 测量缓存未命中

关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭7年前。Improvethisquestion我有一个关键路径,它在一个线程中执行,固定到一个核心。我有兴趣确定发生缓存未命中的位置。环顾四周后,valgrind的cachegrind工具似乎对我有帮助。但是,我对该工具在这种情况下的功能有一些疑问:提供的缓存未命中位置有多具体?是否输出变量名?我可以只介绍一个话题吗?是否可以分析代码的特定部分?所有用于测量缓存未命中的功能,它们是否同样适用于TLB未命中?我可以将cachegrind与我的发布/优化

c++ - 优化 std::visit 可能吗?

在使用std::visit时/std::variant我在探查器输出中看到std::__detail::__variant::__gen_vtable_impl函数花费的时间最多。我做了这样的测试://3classfamilies,alllikethisclassElementDerivedN:publicElementBase{...std::variantGetVariant()override{returnthis;}}std::vectorelements;std::vectorvisitors;std::vectorthirds;//prepareahacktogetdyna

c++ - 子三角形中最大元素的总和

我试过了lastquestion来自今年的CCC2019S5。问题陈述:在平行宇宙中,计算机科学中最重要的数据结构是三角形。大小为M的三角形由M行组成,第i行包含i个元素。此外,这些行必须排列成等边三角形的形状。也就是说,每一行都以通过三角形中间的垂直对称线为中心。例如,下图显示了一个大小为4的三角形:一个三角形包含子三角形。例如,上面的三角形包含十个大小为1的子三角形,六个大小为2的子三角形(其中两个是包含(3,1,2)的三角形和包含(4,6,1)的三角形),三个大小为3的子三角形(其中一个包含(2,2,1,1,4,2))。请注意,每个三角形都是其自身的子三角形。给定一个大小为N的三

c++ - 冷启动优化

我尝试搜索,但到目前为止还没有成功。有谁知道应该如何进行冷启动优化的好资源?有问题的应用程序是C++/MFC应用程序,使用VS2010编译,完整版,内置分析器可用。我试图减少所有额外的重量以获得热启动可接受的加载时间,但冷启动是NotAcceptable。有时接近30秒,而且没有什么是慢代码明智的。CPU负载在热启动期间达到80%,在冷启动期间保持在20%以下。我今天尝试使用延迟加载链接器设置,但我不太明白它们如何影响性能。此外,我尝试了可执行打包程序,但在VM上的测试似乎并没有更快。还有什么我可以尝试的吗? 最佳答案 冷启动时间长

c++ - c/c++ 优化调用函数中的常量变量

C/C++编译器仅在使用-Os、-O1和-O2时使用常量参数(在编译时已知)优化单层函数。他们不会优化所有层。只有-O3可以做到这一点。gcc是不支持“优化”属性的WinAVR4.3.3。voidinner(doublevalue){//operationsusingvalue//...}voidouter(doublevalue){//fewoperationsusingvalue//...inner(value);}intmain(){inner(1);//optimizeouter(1);//onlyoptimizebyusing-O3}除了以下几种可能的解决方案还有哪些?-O3

c++ - SPOJ上通过TLE的代码优化建议

我正在尝试解决类似这样的问题:我有n个数字(1例如,15364less1less5less3less6less4(0)+(1)+(1)+(1+5+3)+(1+3)0+1+1+9+4=15这个问题的一个简单的解决方案是运行两个循环,并为每个给定的数字找到所有小于该数字的数字的总和,最后给出这些总和的总和作为输出。时间复杂度为O(n^2).我认为使用二叉索引树(分域树)可以更好地解决此问题的O(nlogn)。对于每个数字,我将把每个数字添加到一个全局数组a中,并执行两个明显的BIT操作。我认为这个算法的时间复杂度是O(nlogn),如果为真,显然比之前的O(n^2).我已经用C++实现了代

c++ - 链接器可以报告未使用的成员函数吗? (C++)(海合会)

std::string有超过30个可以在字符串对象上调用的成员函数。如果我只使用其中的几个怎么办?我假设未使用的成员函数不会占用可执行代码部分的空间。我很想知道链接器是否有可能确定一个未使用的成员函数,将其从编译二进制文件的一部分中删除,并报告它丢弃的函数。有什么办法吗?我在看gcc'slinkerflags,但我找不到任何相关内容。 最佳答案 自std::string是一个模板类(std::string只是一个typedef到std::basic_string),只有使用过的方法会被实例化,因此不会编译任何未使用的方法,因此它们不

c++ - 优化器是否将临时非 POD 类型移出循环?

给定以下代码:while(is_running){std::vectorbuffers;//fillbuffers//usebuffers}现代编译器是否执行以下转换?std::vectorbuffers;while(is_running){//fillbuffers//usebuffersbuffers.clear();} 最佳答案 确定性知道的唯一方法是测试,但是如果看到优化器执行此优化,我会感到相当惊讶。甚至要开始执行此优化,编译器必须1)充分了解所涉及函数的内部结构以“实现”(例如)operatornew和operatord