GHC有很多可以执行的优化,但是我不知道它们是什么,也不知道它们在什么情况下被执行。 我的问题是:我可以期待什么样的转变,每一次或几乎这样呢? 如果我看一段经常被执行(评估)的代码,我的第一个想法是“嗯,也许我应该优化它”,在这种情况下,我应该第二个想法是“甚至不要去想它, GHC得到这个“? 我正在读“ Stream Fusion:从List到Streams到Nothing”一文 ,以及他们用于将列表处理重写为不同forms的技术,GHC的正常优化将可靠地优化为简单循环,这对我来说是新颖的。 如何知道我的程序何时可以进行这种优化? GHC手册中提供了一些信息 ,但它只是回答这个问题的一部分。 编辑:我开始赏金。 我想要的是像lambda / let / case-floating,types/构造函数/函数参数专门化,严格分析和拆箱,worker / wrapper,以及其他重要的GHC所做的我已经省略的低级转换列表,以及input和输出代码的解释和实例,并且当总效应大于其部分总和时,理想地说明情况。 理想的情况下,提到什么时候转型不会发生。 我并不期望对每一个转换都有新颖的解释,只要大局就是这样,几句话和一行代码就足够了(或者是一个链接,如果不是二十页的科学论文)清除它的结尾。 我希望能够看到一段代码,并能够很好地猜测它是否会被编译成一个紧密的循环,或者为什么不是,或者我将不得不改变来做出来。 (我对stream融合这样的大型优化框架(我只是读了一篇关于这方面的文章)并不是很感兴趣;更多的是写这些框架的人所拥有的知识。
在不同大小的matrix上进行了一些实验之后,出现了一个模式。 不变地, 转置大小为2^n的matrix比转置大小为2^n+1的matrix要慢 。 对于n小值,差异不是很大。 然而,在512的值上会出现很大的差异(至less对我而言) 免责声明:我知道这个函数实际上并没有将matrix转置,因为元素的双重交换,但是没有什么区别。 遵循代码: #define SAMPLES 1000 #define MATSIZE 512 #include <time.h> #include <iostream> int mat[MATSIZE][MATSIZE]; void transpose() { for ( int i = 0 ; i < MATSIZE ; i++ ) for ( int j = 0 ; j < MATSIZE ; j++ ) { int aux = mat[i][j]; mat[i][j] […]
具体来说,如果我有一系列if … else if语句,而且事先知道每个语句的相对概率都是true ,那么它在执行时间上有多大的区别呢? 例如,我应该喜欢这个: if (highly_likely) //do something else if (somewhat_likely) //do something else if (unlikely) //do something 这个? if (unlikely) //do something else if (somewhat_likely) //do something else if (highly_likely) //do something 看起来很明显,sorting的版本会更快,但是为了可读性或副作用的存在,我们可能想要对它们进行非最优sorting。 在实际运行代码之前,也很难判断CPU如何处理分支预测。 所以在试验过程中,我最终回答了自己的一个具体案例的问题,但是我也希望听到其他意见/见解。 重要的是:这个问题假设if语句可以被任意地重新sorting而不会对程序的行为产生任何其他影响。 在我的回答中,三个条件testing是相互排斥的,不会产生副作用。 当然,如果这些陈述必须以一定的顺序进行评估以达到一些理想的行为,那么效率问题就没有意义了。
我正在使用一个inttypes来存储一个值。 通过程序的语义,值总是在一个非常小的范围内变化(0-36), int (不是char )只是因为CPU的效率。 似乎很多特殊的算术优化可以在如此小范围的整数上执行。 对这些整数的许多函数调用可能被优化成一小组“神奇”的操作,并且一些函数甚至可以优化成查表。 那么,是否有可能告诉编译器这个int总是在这个小范围内,编译器是否有可能做这些优化?
在写一个优化的ftol函数的时候,我在GCC 4.6.1发现了一些非常奇怪的行为。 让我先告诉你代码(为了清晰起见,我标出了区别): fast_trunc_one,C: int fast_trunc_one(int i) { int mantissa, exponent, sign, r; mantissa = (i & 0x07fffff) | 0x800000; exponent = 150 – ((i >> 23) & 0xff); sign = i & 0x80000000; if (exponent < 0) { r = mantissa << -exponent; /* diff */ } else { r = mantissa >> exponent; […]
“CPU绑定”和“I / O绑定”是什么意思?
我目前正在使用GCC,但是最近我发现了Clang,并且正在思考转换。 有一个决定因素 – 它产生的二进制文件的质量(速度,内存占用,可靠性) – 如果gcc -O3能产生一个速度提高1%或内存减less1%的二进制文件,那么这是一个交易断路器。 Clang拥有比GCC更好的编译速度和更低的编译时内存占用,但是我真的对编译软件的基准/比较感兴趣 – 你能指点一些还是描述你的经验?
我是一个初学者在rails编程,尝试在页面上显示许多图像。 一些图像是在别人之上。 简单点说,我想要一个蓝色方块,在蓝色方块的右上angular有一个红色方块(但不是在angular落里)。 我试图避免合成(与ImageMagick和类似)由于性能问题。 我只想定位相互重叠的图像。 作为一个更困难的例子,设想一个里程表放置在一个更大的图像。 对于六位数字,我需要合成一百万张不同的图像,或者一次就完成,所需要的就是将六张图像放在另一张图像的上面。
有没有一种方法来configurationVim插件? 当我打开一个大的.py时,我的MacVim变得越来越慢。 我知道我可以取消select所有的插件,并重新select一个一个来检查哪个插件是罪魁祸首,但有没有更快的方法? 我的dotvim在这里: https : //github.com/charlax/dotvim
背景: 当用embedded汇编语言优化一些Pascal代码时,我注意到一个不必要的MOV指令,并将其删除。 令我惊讶的是,删除不必要的指令导致我的程序放慢速度 。 我发现添加任意的,无用的MOV指令可以进一步提高性能 。 效果是不稳定的,并根据执行顺序进行更改: 相同的垃圾指令由单行上下移动会产生减速 。 我了解CPU可以进行各种优化和精简,但是,这看起来更像黑魔法。 数据: 我的代码版本有条件地编译运行2**20==1048576次循环中间的三个垃圾操作 。 (周围的程序只是计算SHA-256散列)。 我的老机器(Intel(R)Core(TM)2 CPU 6400 @ 2.13 GHz)上的结果如下: avg time (ms) with -dJUNKOPS: 1822.84 ms avg time (ms) without: 1836.44 ms 程序循环运行25次,每次运行顺序随机更改。 摘抄: {$asmmode intel} procedure example_junkop_in_sha256; var s1, t2 : uint32; begin // Here are parts of the SHA-256 algorithm, in Pascal: […]