Tag: 微优化

为什么妈妈在Haswell上只有3个周期,与Agner的指令表不同?

我是一个新手在指令优化。 我简单的分析了一个简单的函数dotp,用来得到两个float数组的点积。 C代码如下: float dotp( const float x[], const float y[], const short n ) { short i; float suma; suma = 0.0f; for(i=0; i<n; i++) { suma += x[i] * y[i]; } return suma; } 我使用networkingtesting中的Agner Fog提供的testing框架。 在这种情况下使用的数组是alignment的: int n = 2048; float* z2 = (float*)_mm_malloc(sizeof(float)*n, 64); char *mem = (char*)_mm_malloc(1<<18,4096); char *a = […]

什么更快:in_array或isset?

这个问题仅仅是为了我,因为我总是喜欢写优化的代码,也可以运行廉价的慢服务器(或具有很多stream量的服务器) 我环顾四周,无法find答案。 我想知道这两个例子之间有什么更快的记住,在我的情况下数组的键不重要(自然伪代码): <?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 } } ?> 由于问题的关键不是数组冲突,我想补充一点,如果你害怕碰撞insert $a[$new_value] ,你可以使用$a[md5($new_value)] 。 它仍然可能导致冲突,但是从用户提供的文件中读取时可能会遭受DoS攻击( […]

浮点除法与浮点乘法

编码是否有任何(非微型优化)性能增益? float f1 = 200f / 2 与…相比 float f2 = 200f * 0.5 几年前我的一位教授告诉我,浮点数的分割比浮点数的乘法要慢,但没有详细说明原因。 这个声明是否适用于现代PC架构? UPDATE1 关于评论,请也考虑这种情况: float f1; float f2 = 2 float f3 = 3; for( i =0 ; i < 1e8; i++) { f1 = (i * f2 + i / f3) * 0.5; //or divide by 2.0f, respectively } 更新2从评论引用: […]

如果性能很重要,我应该使用Java的String.format()吗?

我们必须始终为日志输出构buildstring等等。 在JDK版本中我们学习了什么时候使用StringBuffer (很多附加的,线程安全的)和StringBuilder (很多附加的,非线程安全的)。 什么是使用String.format()的build议? 它是有效率的,还是我们不得不坚持串联一个性能重要的单线? 丑陋的旧风格, String s = "What do you get if you multiply " + varSix + " by " + varNine + "?"); 整洁的新风格(可能很慢) String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine); 注意:我的具体使用案例是整个代码中的数百个“单行”日志string。 它们不涉及循环,所以StringBuilder太重了。 我对String.format()特别感兴趣。