草庐IT

OPTIMIZATION

全部标签

c++ - C++中双减法的优化

我有以下代码用于计算两个vector之间的距离:doubledist(vector&vecA,vector&vecB){doublecurDist=0.0;for(size_ti=0;i此功能是我的应用程序中的主要瓶颈,因为它依赖于大量距离计算,在典型输入上消耗超过60%的CPU时间。此外,以下行:doubledif=vecA[i]-vecB[i];负责该函数77%以上的CPU时间。我的问题是:是否有可能以某种方式优化此功能?注意事项:为了分析我的应用程序,我使用了IntelAmplifierXE;减少距离计算的数量不是一个可行的解决方案我; 最佳答案

c++ - isdigit() 总是通过检查

你好,我想检查我的程序,如果用户输入的不是数字,而不是输入数字。所以我做了这个功能voidValidationController::cinError(int*variable){if(!isdigit(*variable)){cin.clear();cin.ignore(256,'\n');cout我这样调用函数:intmore;cin>>more;cinError(&more);所以我的问题是,每次我给出一个数字时,它的行为就像我没有给出一样。它进入if并使变量等于零。我在这里缺少什么? 最佳答案 撇开您错误地使用isdigit

C++ 内联函数和上下文特定优化

我在ScottMeyers的EffectiveC++书中读到:当您内联一个函数时,您可以让编译器对函数体执行上下文特定的优化。这种优化对于正常的函数调用是不可能的。现在的问题是:什么是上下文特定优化以及为什么需要它? 最佳答案 我不认为“上下文特定优化”是一个已定义的术语,但我认为它基本上意味着编译器可以分析调用站点及其周围的代码并使用此信息来优化函数。这是一个例子。当然,它是人为设计的,但它应该证明这个想法:功能:intfoo(inti){if(i调用站点:intbar(){inti=5;returnfoo(i);}如果foo是单

c++ - 有没有更快的方法在 SIMD 上乘以 2(不使用乘法)?

旧float的一个技巧是从不乘以2,而是将操作数与自身相加,如2*a=a+a。今天,使用SSE/SSE2/SSSE3/NEON/...指令集等的旧技巧是否仍然可行?我的操作数是一个vector(比如,4个float,我想乘以2)。乘以3、4...怎么样? 最佳答案 我仍在努力寻找一个例子来说明这会在哪些方面有所作为。我的直觉是,如果延迟是一个问题,那么在某些情况下x+x会更好,但如果延迟不是问题并且只有吞吐量很重要,那么它可能会更糟。但首先让我们讨论一些硬件。让我坚持使用Intelx86处理器,因为这是我最了解的。让我们考虑以下几代

c++ - 小 N 的 std::map 与 unordered_map 内存占用

对于内存使用比速度更重要的嵌入式系统应用程序,最好使用什么map容器?std::map,std::unordered_map?这适用于N小于一百的情况。如果实现很重要,那么我会关注libstdc++实现(GCC)。虽然我知道在内存使用方面不可能超过简单的数组,但我想避免使用具有O(N)性能的数据结构。因此,虽然我想减少内存占用,但我也希望查找速度合理(优于O(N))。我不关心其他操作(插入、删除),因为它们很少发生。如果我想自己测量内存使用情况,我应该如何在Linux平台上进行测量?会boost::flat_map适合作为占用空间小且查找时间优于O(n)的关联容器吗?

c++ - 减少编译时间的奇怪 C++ 模式

我在Tizen项目的OpenSource代码中找到了可以缩短项目编译时间的模式。项目中很多地方都会用到。作为示例,我选择了一个类名ClientSubmoduleSupport。这是一个短的。以下是他们的来源:client_submode_support.h,client_submode_support.cpp.正如您在client_submode_support.h中看到的那样它被定义为ClientSubmoduleSupport和client_submode_support.cpp有定义的ClientSubmoduleSupportImplementation类为ClientSubm

java - 处理循环特殊情况

在Java、C#或C++中,假设我们有一种非常常见的情况,我们需要多次迭代并执行一个函数doX,但只有在一次迭代中我们应该执行一个函数doY。intindex=123456;for(inti=0;i在我看到真正的性能问题的情况下,我通常会在2中中断循环,但这可能会非常痛苦,尤其是在循环体很大的情况下。编译后的代码真的会在每次迭代时检查条件,还是可以由编译器优化?此外,如果index在编译时不是常量,是否可以进行这样的优化? 最佳答案 这通常不会导致严重的性能问题。这是由于branchpredicting.引用这个famousques

c++ - 是否允许 C++ 编译器/链接器删除未使用的方法?

是否允许C++编译器或链接器(根据任何C++标准)删除未使用的方法?似乎允许编译器删除未使用的静态函数,允许链接器删除未使用的函数。但是我没有找到关于类方法的信息。当方法是虚拟的时,这会变得非常有趣。 最佳答案 是的。如果该方法未被使用,则无法判断它已被删除-因此链接器可以这样做。请注意,获取方法的地址很可能算作“使用”该方法-而不仅仅是实际调用它。链接器很可能会删除非虚拟成员函数(这很容易并且节省空间)。它们可以删除未使用的虚函数,但编译器必须添加大量有关它正在调用的虚函数的信息,以便链接器可以删除未使用的虚函数(并可能压缩vta

c++ - 了解内存池

根据我的理解,内存池是一个block,或者多个内存块在运行前在堆栈上分配。相比之下,据我了解,动态内存是从操作系统请求的,然后在运行时在堆上分配。//编辑//内存池显然不一定分配在堆栈上,即。内存池可以与动态内存一起使用。根据对这个问题的回答,显然也非动态内存不一定分配在堆栈上。“动态与静态内存”和“内存池”的主题因此并不真正相关,尽管答案仍然相关。据我所知,内存池的目的是提供RAM的手动管理,其中内存必须由程序员跟踪和重用。这在理论上有利于性能,原因有很多:动态内存会随着时间的推移变得碎片化CPU可以比动态block更快地解析静态内存块当程序员可以控制内存时,他们可以根据特定程序选择

c++ - 复制整数位的最快方法

复制整数位的最快方法是什么。例如,17->10001复制后:1100000011 最佳答案 看起来像是位交错的变体。Interleavebitstheobviousway(modifiedfromhttp://graphics.stanford.edu/~seander/bithacks.html)unsignedintx=17;unsignedintz=0;//zgetstheresultingMortonNumber.for(inti=0;i参见http://graphics.stanford.edu/~seander/bith