Questions tagged «micro-optimization»

微观优化是微调代码小段的过程,目的是解决其操作某些方面的感知不足(过多的内存使用,较差的性能等)。


13
如果性能很重要,我应该使用Java的String.format()吗?
我们必须一直构建String以便进行日志输出等等。在JDK版本中,我们了解了何时使用StringBuffer(很多追加,线程安全)和StringBuilder(很多追加,非线程安全)。 有什么使用建议String.format()?是高效的,还是在性能很重要的情况下,我们被迫坚持采用单线连接? 例如丑陋的旧风格, String s = "What do you get if you multiply " + varSix + " by " + varNine + "?"; 与整洁的新样式(String.format,可能会更慢)相比, String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine); 注意:我的特定用例是整个代码中数百个“单行”日志字符串。它们不涉及循环,所以StringBuilder也太笨重。我String.format()特别感兴趣。



3
为什么我的应用程序会花费其生命的24%进行空检查?
我有一个性能至关重要的二进制决策树,我想将这个问题集中在一行代码上。下面是二叉树迭代器的代码,其中包含针对它进行性能分析的结果。 public ScTreeNode GetNodeForState(int rootIndex, float[] inputs) { 0.2% ScTreeNode node = RootNodes[rootIndex].TreeNode; 24.6% while (node.BranchData != null) { 0.2% BranchNodeData b = node.BranchData; 0.5% node = b.Child2; 12.8% if (inputs[b.SplitInputIndex] <= b.SplitValue) 0.8% node = b.Child1; } 0.4% return node; } BranchData是一个字段,而不是属性。我这样做是为了防止不被内联的风险。 BranchNodeData类如下: public sealed class BranchNodeData { /// …

3
Python中异常处理程序的成本
在另一个问题中,可接受的答案建议用try / except块替换Python代码中的(非常便宜)if语句,以提高性能。 除了编码样式问题外,并假设永远不会触发异常,拥有一个异常处理程序与没有一个异常处理程序,与拥有与零比较的if语句相比,在性能方面有何不同?

4
什么更快:in_array或isset?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 这个问题仅对我而言,因为我一直喜欢编写优化的代码,这些代码也可以在廉价的慢速服务器(或流量很大的服务器)上运行 我环顾四周,却找不到答案。我想知道在这两个示例之间有什么更快的方法,请记住在我的情况下数组的键并不重要(自然是伪代码): <?php $a = array(); while($new_val = 'get over 100k email addresses already lowercased'){ if(!in_array($new_val, $a){ $a[] = $new_val; //do other stuff } } ?> <?php $a = array(); while($new_val = 'get over 100k email addresses already lowercased'){ if(!isset($a[$new_val]){ $a[$new_val] = true; //do other stuff } } …

9
什么时候循环展开仍然有用?
我一直在尝试通过循环展开来优化一些对性能至关重要的代码(一种快速排序算法,在蒙特卡洛仿真中被称为百万次)。这是我要加快的内循环: // Search for elements to swap. while(myArray[++index1] < pivot) {} while(pivot < myArray[--index2]) {} 我尝试展开为以下内容: while(true) { if(myArray[++index1] < pivot) break; if(myArray[++index1] < pivot) break; // More unrolling } while(true) { if(pivot < myArray[--index2]) break; if(pivot < myArray[--index2]) break; // More unrolling } 这绝对没有区别,所以我将其改回了可读性更好的形式。我尝试循环展开时也有类似的经历。鉴于现代硬件上分支预测器的质量,何时展开循环仍然是有用的优化?

7
从Java字符串中剥离所有不可打印字符的最快方法
String用Java剥离所有不可打印字符的最快方法是什么? 到目前为止,我已经尝试并测量了138字节,131个字符的字符串: 字符串的replaceAll()-最慢的方法 517009个结果/秒 预编译模式,然后使用Matcher的 replaceAll() 637836个结果/秒 使用StringBuffer,使用codepointAt()一对一获取代码点并追加到StringBuffer 711946结果/秒 使用StringBuffer,使用charAt()一对一获取字符并追加到StringBuffer 1052964结果/秒 预分配char[]缓冲区,使用charAt()一对一获取字符并填充该缓冲区,然后转换回String 2022653个结果/秒 预分配2个char[]缓冲区-旧的和新的,使用一次获取现有String的所有字符,一次又一次getChars()遍历旧缓冲区并填充新缓冲区,然后将新缓冲区转换为String-我自己最快的版本 2502502结果/秒 具有2个缓冲区的相同内容-仅使用byte[],getBytes()并将编码指定为“ utf-8” 857485结果/秒 具有2个byte[]缓冲区的相同内容,但将编码指定为常量Charset.forName("utf-8") 791076个结果/秒 具有2个byte[]缓冲区的相同内容,但是将编码指定为1字节本地编码(几乎没有理智的事情) 370164结果/秒 我的最佳尝试是: char[] oldChars = new char[s.length()]; s.getChars(0, s.length(), oldChars, 0); char[] newChars = new char[s.length()]; int newLen = 0; for (int j = 0; j < s.length(); j++) …

7
通过强制转换为uint而不是检查负值来执行范围检查是否更有效?
我在.NET的List源代码中偶然发现了这段代码: // Following trick can reduce the range check by one if ((uint) index >= (uint)_size) { ThrowHelper.ThrowArgumentOutOfRangeException(); } 显然,这比(?)更有效 if (index < 0 || index >= _size) 我对这招背后的理由感到好奇。一条分支指令真的比两次转换贵uint吗?还是正在进行其他优化,以使此代码比其他数字比较快? 为了解决房间里的大象问题:是的,这是微优化,不,我不打算在代码中到处使用它–我只是很好奇;)

7
浮点除法与浮点乘法
通过编码是否可以获得(非微优化)性能提升 float f1 = 200f / 2 比较 float f2 = 200f * 0.5 我的一位教授几年前告诉我,浮点除法比浮点乘法要慢,但没有详细说明为什么。 此声明适用于现代PC体系结构吗? 更新1 关于评论,请同时考虑以下情况: float f1; float f2 = 2 float f3 = 3; for( i =0 ; i < 1e8; i++) { f1 = (i * f2 + i / f3) * 0.5; //or divide …

7
是否可以告诉分支预测变量跟随分支的可能性有多大?
为了清楚起见,我在这里不打算进行任何形式的可移植性,因此任何将我与特定机器绑定在一起的解决方案都可以。 基本上,我有一条if语句,它将在99%的时间中将其评估为true,并试图提高性能的最后一个时钟,我是否可以发出某种编译器命令(使用GCC 4.1.2和x86 ISA,如果重要)告诉分支预测器它应该为该分支缓存?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.