草庐IT

OPTIMIZATION

全部标签

c# - 在 C# 和 C++ 中将 float / double 乘以 0.5 而不是除以 2 是否安全?

基本上是这样的(不是真正的代码):for(inti=0;iv0.pos类型为Vector3,但可能是Vector3.这样做安全吗?:Vector3center=(v0.pos+v1.pos)*0.5;这似乎是不成熟的优化,但它必须尽可能快,以便在数十亿点(点云)上调用。 最佳答案 无论如何都不是C++专家,但在C#中,这样做:vara=newFunc((floatf1,floatf2)=>(f1+f2)*0.5);varb=newFunc((floatf1,floatf2)=>(f1+f2)/2);在前者中生成IL:加载参数添加它们

c++ - 现代 C/C++ 编译器能否更好地优化 header 中的代码?

我经常听说将代码放在header中是不好的做法,但将短函数放在header中很常见,部分原因是为了帮助编译器更好地优化。inline关键字可以帮助编译器确定应该内联哪些函数,但除此之外,是否还有理由在header中包含简短的性能关键函数?还是对于现代编译器来说不再重要了? 最佳答案 从技术上讲,inline关键字仅表示允许在多个翻译单元中定义。也就是说,如果您在头文件中定义了一个内联函数,并且该头文件包含在多个源文件中,那就没问题了。对于非内联、非模板函数,这是非法的。但是编译器可以并且确实利用能够看到被调用函数的代码的优势。这种情

c++ - 为什么在这种特殊情况下数据类型会影响性能?

我编写了以下代码来对缓存未命中对性能的影响进行基准测试:#include#include#include#include//Avoidingusingpowerof2becauseofpossibleperformancedegradationduetocacheassociativity?staticconstsize_tROW_SIZE=600;staticconstsize_tCOL_SIZE=600;staticconstsize_tTEST_COUNT=50;#defineSAME_TYPES1#defineINIT_TO_ONE0#ifSAME_TYPES#defineAR

c++ - 访问硬编码数组和运行时初始化数组之间是否存在任何性能差异?

例如,我想使用数组SQRT[i]创建一个平方根表来优化游戏,但我不知道在访问SQRT[i]的值时,以下初始化之间是否存在性能差异:硬编码数组intSQRT[]={0,1,1,1,2,2,2,2,2,3,3,.......255,255,255}在运行时产生值(value)intSQRT[65536];intmain(){for(inti=0;i访问它们的一些例子:if(SQRT[a*a+b*b]>something)...我不清楚程序是否以不同的方式存储或访问硬编码数组,也不知道编译器是否会优化硬编码数组以加快访问时间,是否有性能它们在访问数组时的区别? 最

c++ - vector<double> 比 double* : why? 快

这是我用std::vector试过的一个循环和普通的旧double*.对于1000万个元素,vector版本的运行时间是double*的大约80%。版本需要;对于N的几乎任何值,vector明显更快。查看GCCSTL源代码,我没有看到std::vector正在做任何比double*本质上更有趣的事情习语正在做(即,使用普通旧new[]分配,operator[]取消引用偏移量)。Thisquestion也是这么说的。知道为什么vector版本更快吗?Compiler:GCC4.6.1Examplecompileline:g++-Ofast-march=native-DNDEBUG\-ft

c++ - std::vector< std::vector<unsigned char>> 或 std::deque< std::vector<unsigned char>>?

我有一个现有的算法,如果可能的话,我需要稍微优化它。目前无法在此算法中进行大量更改。该算法适用于std::vector>的实例.它看起来像这样:typedefstd::vectorinternal_vector_t;std::vectorinternal_vectors;while(fetchinglotsofrecords){internal_vector_ttmp;//reads1Mbofcharsintmp...internal_vectors.push_back(tmp);//somemorework}//usethisinternal_vectors算法在internal_v

C++ 集中化 SIMD 使用

我有一个图书馆和许多依赖于该图书馆的项目。我想使用SIMD扩展优化库中的某些过程。然而,保持便携对我来说很重要,所以对用户来说它应该是非常抽象的。我在一开始就说过我不想使用其他一些可以解决问题的很棒的库。我实际上想了解我想要的东西是否可能以及在多大程度上是可能的。我的第一个想法是拥有一个“vector”包装类,SIMD的使用对用户是透明的,并且可以使用“标量”vector类以防目标机器上没有可用的SIMD扩展。我想到了一个天真的想法,即使用预处理器根据编译库的目标从众多vector类中选择一个。因此,一个标量vector类,一个带有SSE的类(基本上是这样的:http://fastcp

c++ - 关于gcc O3 optimization flag的疑惑

我有g++4.7.3编译器。我正在尝试遵循优化标志描述http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/Optimize-Options.html下一个问题:我有一个程序,它使用-O2和-O3标志给出不同的时间。-O2比-O3快两倍。O2时间为8毫秒,O3时间为16毫秒。所以我想了解到底是什么造成了差异。在上面的链接中,我看到:“O3优化更多。-O3开启所有由-O2指定的优化,同时开启-finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-after-reload、-ftr

c++ - c++ 中的高性能代码(继承、指向函数的指针、if)

假设您有一个非常大的图,其节点上有大量处理(例如每个节点数千万次操作)。每个节点的核心例程都是相同的,但根据内部情况会有一些额外的操作。可以有2个这样的条件产生4种情况(0,0)、(1,0)、(0,1)、(1,1)。例如。(1,1)表示两个条件都成立。条件在程序中建立一次(每个节点独立设置一组),并且从那时起永远不会改变。不幸的是,它们是在运行时以完全不可预测的方式确定的(基于通过HTTP从外部服务器接收的数据)。在这种情况下最快的是什么?(考虑到我不知道的现代编译器优化)简单地使用“IF”:如果(条件X)执行附加操作X。使用继承从基类派生四个类(公开方法OPERATION)以进行适当

c++ - 需要更快地计算(近似)方差

我可以通过CPU分析器看到,compute_variances()是我项目的瓶颈。%cumulativeselfselftotaltimesecondssecondscallsms/callms/callname75.635.435.4340135.75135.75compute_variances(unsignedint,std::vector>const&,float*,float*,unsignedint*)19.086.801.37readDivisionSpace(Division_Euclidean_space&,char*)...这是函数体:voidcompute_var