Tag: 优化

一个C ++优化器重新sorting调用clock()是否合法?

C ++编程语言第4版(第225页)表示: 只要结果与简单的执行顺序相同,编译器就可以对代码进行重新sorting以提高性能 。 一些编译器,例如发布模式下的Visual C ++,将重新排列这个代码: #include <time.h> … auto t0 = clock(); auto r = veryLongComputation(); auto t1 = clock(); std::cout << r << " time: " << t1-t0 << endl; 进入这种forms: auto t0 = clock(); auto t1 = clock(); auto r = veryLongComputation(); std::cout << r << " time: " << t1-t0 […]

加快茱莉亚写得不好的R例子

Julia比较性能和R的例子看起来特别复杂 。 https://github.com/JuliaLang/julia/blob/master/test/perf/perf.R 什么是最快的性能,你可以从下面的两个algorithm中得出(最好是解释一下你改变了什么使它更像R)? ## mandel mandel = function(z) { c = z maxiter = 80 for (n in 1:maxiter) { if (Mod(z) > 2) return(n-1) z = z^2+c } return(maxiter) } mandelperf = function() { re = seq(-2,0.5,.1) im = seq(-1,1,.1) M = matrix(0.0,nrow=length(re),ncol=length(im)) count = 1 for (r in re) { for (i […]

JavaScript中的三元运算符没有“Else”

我一直不得不在其他没有任何条件的情况下使用null 。 反正有吗? 例如 condition ? x = true : null; 基本上,有没有办法做到这一点: condition ? x = true; 现在它显示为一个语法错误 仅供参考,下面是一些真实的示例代码: !defaults.slideshowWidth ? defaults.slideshowWidth = obj.find('img').width()+'px' : null;

什么是.NETreflection的“成本”?

可能重复: .NETreflection代价如何? 我目前处于编程心态,反思是我最好的朋友。 我使用它很多dynamic加载的内容,允许“松散实现”,而不是严格的接口,以及许多自定义属性。 什么是使用reflection的“真实”成本? 对于经常reflection的types来说,是否值得为cachingreflection付出努力,比如我们自己的LINQ DAL目标代码在所有属性上的表定义? 高速caching的内存占用是否会反映CPU使用率?

使string小写的第一个字符最有效的方法?

什么是使String小写的第一个字符最有效的方法? 我可以想到许多方法来做到这一点: 使用charAt()和substring() String input = "SomeInputString"; String output = Character.toLowerCase(input.charAt(0)) + (input.length() > 1 ? input.substring(1) : ""); 或者使用一个char数组 String input = "SomeInputString"; char c[] = input.toCharArray(); c[0] = Character.toLowerCase(c[0]); String output = new String(c); 我相信还有很多其他很好的方法来实现这一点。 你有什么build议?

为什么GCC不能优化“x &&(x&4242)”到“x&4242”的逻辑按位AND对?

这里有两个function,我声称做同样的事情: bool fast(int x) { return x & 4242; } bool slow(int x) { return x && (x & 4242); } 从逻辑上说,他们做同样的事情,只是为了100%肯定我写了一个testing,通过他们两个跑了所有40亿可能的投入,他们匹配。 但汇编代码是一个不同的故事: fast: andl $4242, %edi setne %al ret slow: xorl %eax, %eax testl %edi, %edi je .L3 andl $4242, %edi setne %al .L3: rep ret 我感到惊讶的是,海合会无法跨越逻辑消除冗余testing。 我用-O2,-O3和-Os尝试了g ++ 4.4.3和4.7.2,所有这些都生成了相同的代码。 该平台是Linux x86_64。 有人可以解释为什么海湾合作委员会不应该足够聪明,在这两种情况下生成相同的代码? 我也想知道其他编译器是否可以做得更好。 […]

在C中使用restrict关键字的规则?

我试图了解何时何时不使用C中的restrict关键字,以及在什么情况下它提供了实际的好处。 阅读后,“ 解密限制关键字 ”(提供了一些使用经验的规则),我得到的印象是,当一个函数传递指针时,必须考虑到指向的数据可能重叠的可能性(别名)与任何其他parameter passing给函数。 给定一个函数: foo(int *a, int *b, int *c, int n) { for (int i = 0; i<n; ++i) { b[i] = b[i] + c[i]; a[i] = a[i] + b[i] * c[i]; } } 编译器必须在第二个expression式中重新加载c ,因为可能b和c指向相同的位置。 它也必须等待b被存储之前,它可以加载a相同的原因。 然后它必须等待a被存储,并且必须在下一个循环开始时重新加载b和c 。 如果你这样调用函数: int a[N]; foo(a, a, a, N); 那么你可以看到为什么编译器必须这样做。 有效地使用restrict告诉编译器,你永远不会这样做,这样它可以放弃c的冗余负载,并加载之前b存储。 在另一个SOpost中,Nils Pipenbrinck提供了这个场景的一个工作示例,展示了性能优势。 到目前为止,我已经认识到,对传递给不会被内联的函数的指针使用restrict是个好主意。 显然,如果代码被内联,编译器可以发现指针不重叠。 […]

为什么更喜欢在C + +无符号签名?

我想更好地理解为什么selectint unsigned ? 就我个人而言,除非有合理的理由,否则我从来不喜欢签名的值。 例如数组中项目的数量,string的长度,内存块的大小等,所以这些事情往往不可能是负面的。 这样的价值没有可能的意义。 在所有这些情况下,为什么更喜欢int ? 我问这个,因为Bjarne Stroustrup和Chandler Carruth都给出了build议,希望int在这里没有 unsigned (约12:30) 。 我可以看到在short或long使用int的参数 – int是目标机器体系结构的“最自然的”数据宽度。 但签署无签名总是恼火我。 在典型的现代CPU架构上,签名值是否真的更快? 是什么让他们更好?

查看ArrayList是否包含Java中的对象的最有效的方法

我有一个Java对象的ArrayList。 对象有四个字段,其中两个我会用来考虑对象等于另一个。 我正在寻找最有效的方式,给这两个领域,看看数组是否包含该对象。 扳手是这些类是基于XSD对象生成的,所以我不能修改这些类来覆盖.equals 。 有什么更好的方法比循环和手动比较每个对象的两个领域,然后打破时发现? 这似乎很混乱,寻找更好的方法。 编辑: ArrayList来自一个解组到对象中的SOAP响应。

C ++:将一个操作数保存在一个寄存器中,这个速度非常巨大

我一直想通过使用下面的代码来计算一个对数组元素进行扩展和求和的例程,来了解在L1caching中的数组对数组的影响。(我知道我应该通过' a“;关键是在循环中同时执行乘法和加法操作 – 到目前为止,编译器还没有计算出”a“): double sum(double a,double* X,int size) { double total = 0.0; for(int i = 0; i < size; ++i) { total += a*X[i]; } return total; } #define KB 1024 int main() { //Approximately half the L1 cache size of my machine int operand_size = (32*KB)/(sizeof(double)*2); printf("Operand size: %d\n", operand_size); double* X […]