Tag: 优化

试图了解gcc选项-fomit-frame-pointer

我要求Google给我gcc选项的含义-fomit-frame-pointer ,它将我redirect到下面的语句。 -fomit帧指针 不要将帧指针保存在寄存器中 需要一个。 这避免了保存,设置和恢复帧的说明 指针; 它也使许多function提供额外的寄存器。 它 也使一些机器上的debugging成为不可能。 根据我对每个函数的了解,一个激活logging将在进程内存堆栈中创build,以保留所有局部variables和更多信息。 我希望这个帧指针意味着一个函数的激活logging的地址。 在这种情况下,哪些types的函数不需要将帧指针保存在寄存器中? 如果我得到这个信息,我会尝试devise新的函数(如果可能的话),因为如果帧指针没有保存在寄存器中,一些指令在二进制中将被忽略。 这在function很多的应用程序中会显着提高性能。

C ++caching感知编程

有没有一种方法在C ++来确定CPU的caching大小? 我有一个algorithm处理大量的数据,我想把这些数据分解成块,使它们适合caching。 这可能吗? 你可以给我任何其他暗示编程高速caching(特别是在multithreading/多核数据处理方面)的提示吗? 谢谢!

SSE SSE2和SSE3用于GNU C ++

有没有一个简单的教程,以加快在SSE,SSE2和SSE3在GNU C + +? 你怎么能在SSE做代码优化?

在C#中进行math优化

我一整天都在分析一个应用程序,并且优化了一些代码,我把它留在了我的待办事项列表中。 这是一个neural network的激活function,被称为超过1亿次。 根据dotTrace,它占总function时间的大约60%。 你将如何优化这个? public static float Sigmoid(double value) { return (float) (1.0 / (1.0 + Math.Pow(Math.E, -value))); }

在移动设备上testingNEON优化的cv :: threshold()

对于ARM设备(手机),我一直在为OpenCV的阈值function写一些优化。 它应该在Android和iPhone上工作。 但是,我没有一个设备来testing它,所以我正在寻找志愿者给我一点帮助。 如果这激励你更多,我打算将它发送到OpenCV,以便将其集成到主存储库中。 我会对代码的正确性感兴趣,如果它恰好按照预期工作,那么对原始/优化性能进行一些统计。 不要忘记看所有的情况。 所以,这里是代码。 要运行它,请粘贴到位于第228行(截至2.4.2)的opencv/modules/imgproc/src/thresh.cpp – 正好在SSE块的下面,然后重新编译OpenCV。 另外,在文件的顶部添加这一行 #include <arm_neon.h> 主代码体: #define CV_USE_NEON 1 #if CV_USE_NEON //if( checkHardwareSupport(CV_CPU_ARM_NEON) ) if( true ) { uint8x16_t thresh_u = vdupq_n_u8(thresh); uint8x16_t maxval_ = vdupq_n_u8(maxval); j_scalar = roi.width & -8; for( i = 0; i < roi.height; i++ ) { const uchar* src = (const uchar*)(_src.data […]

GMSPolyline非常大的记忆秒杀

在GPS应用程序中,用户可以显示我们称之为各种不同types地图的复杂位置点列表,每个轨道可以包含2k到10k个位置点。 在非Google地图types中渲染时,轨道被大量修剪,修剪和path简化。 这是为了保持内存使用率和性能。 即使在最坏的情况下,我们通常也只能提交远远less于一千(总计)的转换位置点到OpenGLstream水线。 在整合Google Maps SDK for iOS时,我们最初试图继续利用我们自己的OpenGL轨道渲染系统,但碰到OpenGL上下文冲突的问题(渲染工作,但是我们无法获得GMSMapView和我们自己内部的OpenGL资源以释放没有人接触删除的内存)。 因此,我们正在尝试利用GMSPolyline结构,并让Google SDK进行跟踪呈现,但是我们遇到了主要的内存使用问题,并正在寻找解决这些问题的指导。 使用Xcode仪器,我们在创build约25条聚合线时总共监测了23k个位置点(不是每个)的内存使用情况。 在创build多行的过程中,应用程序内存使用量从大约14 MB增加到大约172 MB,净峰值大约为158 MB。 不久之后,所有的多线创build,内存使用最终下降到约19 MB,似乎是稳定的,累计净额约5 MB,所以看来每个位置点需要大约220个字节(5 MB / 23K点)商店。 什么伤害我们是峰值内存使用情况。 虽然我们的实验室testing只使用了23k的位置点,但在现实世界中,通常还有更多,而iOS似乎在Google地图在iPhone 5上消耗大约450 MB之后放弃了我们的应用程序(而我们的内部多线渲染系统达到了峰值相同testing用例为12 MB)。 显然, GMSPolyLine结构不适用于我们要求的大量使用。 我们尝试用独立的自动释放池包装一些多行创build循环,然后在适当的位置排空这些循环,但这对内存使用没有影响。 创build多边形线后控制回到主运行循环的峰值内存使用根本没有变化。 后来变得清楚为什么; 在创build多行之后,Google Map系统才会释放资源,直到第一个DisplayLinkcallback。 我们接下来的工作就是手动调整我们在GMSPolyline中推送的数据量,可能会使用我们自己的边界testing,裁剪,修剪和最小化,而不是依靠Google地图来有效地完成这项工作。 这里的缺点是,这将意味着更多的GMSPolyline对象将被分配和释放,可能在用户在地图上进行平移/缩放的时候。 这些对象中的每一个都将具有更less的位置点,但是仍然担心这种方法的不可预见的后果,即许多GMSPolyline分配和释放的隐藏开销。 所以问题是,处理这种情况的最好方法是什么?谷歌的某个人可以对GMSPolyline最佳实践,上限,瓶颈等方面GMSPolyline ?

在条件上更新variables的最快方法是什么?

我有一个指针, ptr和一个条件cond 。 如果cond为true ,则需要尽可能快的方法来重置ptr如果cond为true ,则保持ptr不变。 目前的实现是平凡的: void reset_if_true(void*& ptr, bool cond) { if (cond) ptr = nullptr; } 我知道上面的代码的性能是好的,我不能指望一个主要的性能提升优化它。 然而,这个代码被称为每秒数百万次,每个小纳秒节省相关。 我在考虑摆脱这个分支的东西,例如: void* p[] = { ptr, nullptr }; ptr = p[cond]; 但我不确定这是继续进行的最好方法。

无网格K均值(或其他优化)

注意:我会更多地了解如何处理和提出这些解决scheme的指南,而不是解决scheme本身。 在我的系统中,我有一个非常关键的性能function,在特定环境下显示为头号性能分析热点。 它处于k-means迭代的中间(已经使用并行处理multithreading来处理每个工作线程中的点的子范围)。 ClusterPoint& pt = points[j]; pt.min_index = -1; pt.min_dist = numeric_limits<float>::max(); for (int i=0; i < num_centroids; ++i) { const ClusterCentroid& cent = centroids[i]; const float dist = …; if (dist < pt.min_dist) // <– #1 hotspot { pt.min_dist = dist; pt.min_index = i; } } 处理这部分代码所花费的时间大大减less,所以我经常在摆弄这些东西。 例如,将质心循环置于外部可能是值得的,并且对于给定的质心并行地遍历点。 这里的聚类点的数量跨越了数百万,而质心的数量跨越了数千个。 该algorithm适用于less数几次迭代(通常在10以下)。 它不寻求完美的收敛/稳定性,只是一些“合理”的近似。 任何想法都是值得赞赏的,但是我真正渴望发现的是,如果这个代码可以做到无分支,因为它可以允许一个SIMD版本。 我还没有真正发展出那种能够轻易掌握如何提出无分支解决scheme的思维能力:我的大脑在那里失败的很多,就像我在早期第一次接触到recursion的时候一样,所以一个关于如何写无分支代码以及如何培养适当的思维方式也是有帮助的。 […]

最有效的方法遍历所有的DOM元素?

不幸的是,我需要遍历页面的所有DOM元素,我想知道最有效的技术是什么。 我大概可以基准这些自己,如果我有时间,但我希望有人已经经历了这个或有一些select,我没有考虑。 目前我正在使用jQuery并执行此操作: $('body *').each(function(){ var $this = $(this); //do stuff }); 虽然它起作用,但似乎会给客户带来一些滞后。 它也可以使用像$('body', '*')这样更具体的jQuery上下文来调整。我发现原生javascript通常比jQuery更快,而且我发现它。 var items = document.getElementsByTagName("*"); for (var i = 0; i < items.length; i++) { //do stuff } 我假设本地选项更快。 想知道是否有其他的select,我没有考虑。 也许是并行迭代子节点的recursion选项。

什么专栏通常做出好的指标?

作为“ 索引是什么以及如何使用它们来优化数据库中的查询? ”的后续操作,我正在试图了解索引,哪些列是好的索引候选? 特别是对于MS SQL数据库? 一些谷歌search后,我已经阅读的一切表明,通常增加和独特的列做了一个很好的索引(像MySQL的auto_increment),我明白这一点,但我使用MS SQL和我使用的主键GUIDs,所以它似乎该索引不会使GUID列受益…